C与C++异常处理机制详解

C 和 C++的异常这块,初学的时候确实挺容易绕晕的,是从没有内置异常机制的 C 跳到 C++那一整套try-catch-throw体系,跨度还蛮大。这篇资源挺全面,从最基础的 C 风格错误返回值讲到 C++的 RAII、std::bad_alloc、甚至微软特有的 SEH 都提到了,内容丰富但不啰嗦,适合查漏补缺。

标准 C 里本身没啥异常,只能靠fopen这种函数的返回值来判断,比如文件没打开,返回NULL,你得手动。虽然土,但稳定。

微软的 SEH算是给 C 增强了一点“异常感”,但用起来略重,宏和 API 有点多,不过在 Windows 平台开发,是低层系统调用里,还是比较实用的。

C++的异常体系就比较舒服了,try-catch语法清晰,还可以抛出你自己定义的异常类型。比如:

throw std::runtime_error("Something went wrong");

catch 也可以精准不同异常,写法灵活:

try {
  riskyFunction();
} catch (const std::runtime_error& e) {
  std::cout << e>

资源释放方面,靠RAII搞定,异常一抛,栈退一层,对象析构自动释放内存,爽。要注意的是new失败会抛std::bad_alloc,但可以用std::nothrow让它安静点:

int* p = new(std::nothrow) int[10000];
if (!p) {
  std::cout << "Allocation failed";
}

placement newplacement delete也有讲,适合需要手动控制内存生命周期的场景。虽然用得少,但了解一下也不亏。

对异常安全也讲得挺到位,从基本无异常三种安全级别,配合模板场景讲了一些实战建议,比较有参考价值。

如果你平时写 C++比较多,或者项目里偶尔要和底层 SEH 打交道,这篇文章可以留个书签,查起来方便。原文地址在这:C++异常详解

doc 文件大小:475.5KB