- 主题:一直没明白异常为什么会是类的模式
没搞清楚,难道不是固定数字才是最本质的么。
--
FROM 183.255.219.*
你说的每个字都认识,但没看懂
--
FROM 114.245.255.*
发生异常的时候是怎么构造异常类的。
【 在 z16166 的大作中提到: 】
: 你说的每个字都认识,但没看懂
--
FROM 183.255.219.*
因为将每一次异常,封装为一个对象,普适性更强。
--
FROM 171.213.159.*
面向对象啊
【 在 chaobill 的大作中提到: 】
:
: 没搞清楚,难道不是固定数字才是最本质的么。
#发自zSMTH@23013RK75C
--
FROM 114.241.249.*
因为会有自定义异常
【 在 chaobill (若我离去,后会无期) 的大作中提到: 】
: 没搞清楚,难道不是固定数字才是最本质的么。
: --
: 1.退烧药,止痛药,中药,抗生素,免疫增强药,激素,病毒复制阻断药
: 都不能杀死病毒,自限性疾病只能等自愈,那些庸医只是浪费病人钱财
--
FROM 223.104.41.*
数字包含的信息太少太少了,同一个异常能代表不同含义,异常有堆栈信息,抛出时可以穿透调用栈。
现代编程语言,要简化开发成本,把古老的技术用更易用的方式包装好。
【 在 chaobill 的大作中提到: 】
: 没搞清楚,难道不是固定数字才是最本质的么。
论坛助手,iPhone
--
FROM 101.90.160.*
只是风格不同而已,c和go就是用错误码,不也好好的,c++异常的问题主要是潜规则和坑太多,不如java安全和直观
--
FROM 219.142.253.*
两种错误处理方式 一种是返回错误值,一种是抛异常
【 在 chaobill 的大作中提到: 】
: 没搞清楚,难道不是固定数字才是最本质的么。
--
FROM 114.249.20.*
chatgpt轻松回答这类问题
这是一个非常经典而又颇具争议的问题。你问得很好:为什么 C++ 异常要抛出一个类对象,而不是像 C 的 errno 那样用一个固定的数字表示错误码?
让我们从几个维度来剖析这个设计选择的动因:
1. C++ 是一个面向对象语言,异常本身也是对象
C++ 设计者(尤其是 Bjarne Stroustrup)追求一致的抽象能力,异常机制自然也应当支持:
继承(多态异常类型)
类型识别(catch (const FileNotFound&) vs catch (const NetworkTimeout&))
异常传递过程中携带丰富的信息(字符串、上下文、栈追踪、错误码等等)
所以 C++ 选择让异常是一个“可以携带语义的对象”,而不是简单的整数。
2. 错误码太简陋,不够表达复杂语义
错误码最大的缺陷是:
容量有限(一个 int 表达不了复杂情况)
可读性差(105 == TIMEOUT,不如 TimeoutError("connection timed out"))
没有类型系统支持(容易漏检查)
3. 类型匹配让错误处理更精细
异常对象是有类型的,这样可以使用 catch 子句按类型分类处理异常。
4. 异常可以传递复杂状态和上下文
异常类对象可以封装很多信息,
这样你不仅知道出错了,还能知道是什么错误,在什么上下文下发生的。这对调试和日志非常有帮助。
5. 错误码风格更像 C,而异常是现代语言的趋势
C 风格的错误码:
简单、可预测
但容易遗漏检查(因为你要每次手动检查返回值)
与控制流耦合度太高
而 C++ 的异常机制:
可以把错误处理代码从主逻辑中分离出来,保持清晰
利用 RAII 自动清理资源
更符合“只处理你感兴趣的异常”这种思想
什么时候抛整数是合理的?
你说的“抛出一个错误码”其实不是不合理,在某些简洁系统中也可以这么做。
但这样你失去了类型和信息。现代 C++ 推荐的做法是定义异常类并继承自 std::exception。
总结:为什么不是抛一个数字?
抛出数字 抛出类对象
简单、轻量 结构化、可扩展
缺乏语义 类型区分明确
不利于维护 易于分类处理
不能携带上下文 可以存储错误码、描述、调用环境等
所以 C++ 采用抛出对象的设计,是为了与面向对象风格一致,并提供更强的表达能力、类型安全和灵活性。
--
FROM 123.115.134.*