C++ 异常处理机制与自定义异常体系
1. C 语言传统的处理错误的方式
C 语言传统的错误处理机制主要有两种方式:终止程序和返回错误码。这两种方式虽然简单易用,但各自也有其局限性和缺陷,尤其是在处理复杂错误或大规模程序时,往往会导致维护上的困难。
1. 终止程序
一种常见的错误处理方式是直接终止程序,这种方式通常是通过使用**assert宏实现的。assert**会在程序运行时对条件进行检查,如果条件不满足,则程序会立即终止并输出错误信息。
#include <assert.h>
void foo(int x) {
assert(x != 0); // 如果 x 为 0,程序终止
printf("x is not zero\n");
}
int main() {
foo(0); // 触发断言,程序终止
return 0;
}
缺陷:
- 用户难以接受:程序直接终止,尤其是当发生一些小错误或边界条件时,用户体验很差。
- 适用场景有限:这种方式适用于严重错误(如内存错误、除 0 错误等),但不适合所有情况,因为大多数程序错误并不需要完全终止程序。
当程序遇到无法恢复的错误时,**assert**可以有效地帮助开发者检测出问题。但是,当程序出现一些非致命错误时,用户希望程序能够优雅地处理,而不是直接崩溃。
2. 返回错误码
另一个常见的错误处理方式是通过返回错误码来通知程序出现了问题。这种方法在 C 语言中非常普遍,许多标准库函数**(如malloc、fopen等**)都通过返回一个特殊的错误码来表示函数执行失败。开发者需要根据返回值来判断错误,并做相应的处理。
比如,malloc在分配内存失败时返回NULL,fopen在打开文件失败时返回NULL,errno则是一个全局变量,用于记录最近一次系统调用的错误码。
缺陷:
- 需要手动检查错误码:程序员必须检查每个函数调用的返回值,以便发现错误。这导致了大量重复的错误处理代码,增加了维护成本。
- 错误信息不够直观:虽然可以通过来获取详细的错误信息,但这通常不如异常机制直观。错误码本身通常是数字,缺乏对错误本质的描述,需要额外的逻辑去理解错误码的含义。


