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 new和placement delete
也有讲,适合需要手动控制内存生命周期的场景。虽然用得少,但了解一下也不亏。
对异常安全也讲得挺到位,从基本、强到无异常三种安全级别,配合模板场景讲了一些实战建议,比较有参考价值。
如果你平时写 C++比较多,或者项目里偶尔要和底层 SEH 打交道,这篇文章可以留个书签,查起来方便。原文地址在这:C++异常详解。
475.5KB
文件大小:
评论区