Skip to content

🛡️ 跨语言错误处理与控制流哲学

错误处理是设计语言时最具争议的领域。本文对比 Java/Python/C# 异常机制 (Exceptions) vs Rust Result<T, E> vs Go 显式返回值 err vs C++23 std::expected

NOTE

HTML/CSS 没有异常控制流。浏览器通常容错解析 HTML,并忽略无法识别或无效的 CSS 声明;工程中应通过 Validator、Stylelint 和浏览器测试提前发现问题。


1. 📊 八大语言错误处理机制对照表

语言核心错误处理机制是否强制要求调用方处理性能开销典型范式与代码
RustResult<T, E> + ? 运算符编译期强约束 (弃用报警)0 额外开销let res = fetch_data()?;
Go双返回值 (T, error)依靠 Lint / 习惯约束0 额外开销val, err := doSomething()
JavaChecked Exception & Unchecked ExceptionChecked 强要求 try-catch发生异常时产生 StackTrace 开销try { ... } catch (IOException e)
C++23Exception / std::expected<T, E>std::expected 可显式校验异常路线有 Stack Unwind 开销auto res = parse_num("42");
PythonException / EAFP 哲学运行时捕获抛异常开销较大try: ... except ValueError:
C#Exception 体系不强制 Checked产生 StackTracetry { ... } catch (Exception ex)

2. 🛡️ 错误处理哲学三大流派

流派 A: 显式值返回与代数数据类型 (Rust & C++23)

错误不是破坏控制流的异常,而是函数返回类型的一部分。通过 Result<T, E> 强制要求调用者显式处理。

流派 B: 多返回值与显式校验 (Go)

显式返回 (result, err),代码直观透明,杜绝隐式异常穿透。

流派 C: 异常捕获与 Stack Trace 展开 (Java, Python, C#)

使用 try-catch / try-except 捕获运行期冒泡的 Exception,适合快速开发。

Released under the MIT License.