AI Library · 知识库

# 语言哲学:错误处理的两种流派与边界设计

学习目标:从端口解析与错误传播示例推导“显式值返回”与“异常中断机制”在可见性、传播链与恢复策略上的根本取舍。

前置阅读:字符串转端口号、表达与传播失败 与 区分失败原因。

# 两组完全不同的调用方心智

在字符串转端口号中,面对外部非法文本(如 "65536"),各语言向调用方暴露的接口形态呈现出鲜明的分野:

这并不是单纯的语法偏好,而是对**“调用方是否必须在每一步直面失败”**这一哲学命题的不同回答。

# 显式结果流派的取舍

# 机制事实

# 设计分析

# 异常机制的优势与失控陷阱

# 机制事实

# 设计分析

# Java 受检异常的历史教训

Java 曾经试图兼收两者的优点:引入受检异常(Checked Exception),要求所有可能发生的业务失败必须在方法签名中通过 throws SomeException 显式声明,并在编译期强制调用方必须显式 try-catch 或继续声明传播。

# 为什么后续几乎所有新语言(C#, Kotlin, Go, Rust, Swift)全部放弃了受检异常?

  1. 与高阶函数和泛型流严重冲突:在 Java 8 引入 Stream API 和 Lambda 表达式后,若传递的函数体抛出受检异常,标准的 Function<T, R> 接口由于未声明 throws,会导致编译直接失败,迫使开发者写出极其恶心的嵌套 try-catch 包装。
  2. 引发大规模滥用:为了逃避繁重的声明链条,许多开发者选择机械地向上抛出笼统的 throws Exception,或者在 catch 块中写上空的注释 // ignore,反而彻底抹杀了异常设计的初衷。

# 相关阅读