如果函数不抛出异常,或抛出异常是不可恢复错误,加上noexcept

一个C++函数,如果函数不抛出异常,或抛出异常是不可恢复错误,就应该加上noexcept。

函数实现加上noexcept,内部代码如果抛出异常,会立即调用std::terminate()使得程序崩溃,不会被外层的try catch捕获到。

编写异常安全函数和编写noexcept函数是两个不同的错误处理策略。异常安全函数编写较为复杂,但可以将处理C++异常产生的崩溃的责任向调用者传递。noexcept函数编写较为简单,但必须在函数内部尽可能处理掉C++异常产生的崩溃。

非noexcept函数指针既可以指向非noexcept函数实现,也可以指向noexcept函数实现。noexcept函数指针只能指向noexcept函数实现。函数指针仅在编译时类型检查层面检查noexcept性质,并不会阻止运行时抛出异常。

如果基类虚函数不是noexcept,派生类override的虚函数可以是noexcept也可以不是noexcept。如果基类虚函数是noexcept,派生类override的虚函数必须是noexcept。

析构函数、operator delete/delete[]、=default且依赖的部分不抛出异常,自动是noexcept。

默认构造函数、移动构造函数、移动赋值运算符、swap函数、extern "C"函数,推荐实现为noexcept,但并不自动是noexcept。

WndProc等系统回调函数最好实现为noexcept,不管回调声明上原来有没有noexcept。

COM组件所有COM方法最好实现为noexcept,不管接口声明上原来有没有noexcept。

如果需要编写extern "C"声明,可以定义宏来解决C和C++语法不一致的问题。

#ifdef __cplusplus
#define Extern_C extern "C"
#define Noexcept noexcept
#else
#define Extern_C extern
#define Noexcept
#endif

Extern_C void* mylib_OpenFile(const char* name, int mode) Noexcept;

关于C++中的异常和错误,可以参考一下CppCoreGuidelines。

https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-errors

发布了29 篇原创文章 · 获赞 1 · 访问量 3397

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/103887893