软件企业网站建设栏目结构图,如何做众筹网站,建筑网站新闻写那些好,帝国做的网站怎么上传目录C noexcept#xff1a;1、用途2、用法1、noexcept声明符的用法#xff1a;2、noexcept运算符的用法异常传播1、异常传播的定义2、异常传播中的规则3、异常传播的代价C noexcept#xff1a;
1、用途
C11使用noexcept指明函数是否抛出异常#xff1a; 若函数不抛异常 noexcept1、用途2、用法1、noexcept声明符的用法2、noexcept运算符的用法异常传播1、异常传播的定义2、异常传播中的规则3、异常传播的代价C noexcept
1、用途
C11使用noexcept指明函数是否抛出异常 若函数不抛异常则可做编译优化 即便函数抛异常也不再说明所抛异常类型(简化) 注意C03将throw(ExceptionType)放到函数后面说明函数会抛出什么类型的异常也被称为“异常规约” java用 throws关键字做同样的事情
2、用法
1、noexcept声明符的用法
void foo() noexcept {} //函数不抛异常void foo() noexcept(true) {} // noexcept(true)等价于noexceptvoid foo() {} // 可能会抛出异常void foo() noexcept(false) {} // noexcept(false)等价于什么也不写可能会抛出异常需要注意的地方 1、noexcept不能用于区分重载函数。
2、如果我们声明函数时说了它不抛异常但是又在noexcept函数中抛出异常这就等于调用std::terminate()终结程序的运行。
void f() { /* 潜在抛出异常 */ }
void g() noexcept {f(); // 合法即 使 f 抛出 throw 42; // 合法等效于调用 std::terminate
}编译时会报警告 主函数调用foo(),运行时程序会终止
2、noexcept运算符的用法
bool noexcept( expression ) noexcept 运算符进行编译时检查若表达式声明为不抛出任何异常则返回 true。 noexcept (may_throw())返回false表明可能会抛异常。 noexcept (no_throw())返回true表明不抛异常。
void may_throw();
void no_throw() noexcept;
int main() {std::cout std::boolalpha Is may_throw() noexcept? noexcept (may_throw()) \n Is no_throw() noexcept? noexcept (no_throw()) \n;
}异常传播
1、异常传播的定义
嵌套的函数调用每个函数中都有 try-catch 块内层函数抛出异常这时候会出现异常传播 如图func3中出现了异常如果没有被func2中的catch捕获到的话异常会随着函数的返回交给函数的上一级(func1)处理如果func1也处理不了则交给main函数处理如果main函数处理不了程序会崩溃。 需要注意的地方 try块中抛出异常的语句后面的语句catch的异常类型与所需匹配的异常实例的类型 2、异常传播中的规则
try-catch的执行规则 try块中的异常抛异常的语句后的块代码都被跳过并开始找exception handler的代码即找catch代码找exception handler的流程沿函数调用的链反向寻找(1) 按catch块的顺序对比找到则执行catch块代码(2) 找不到退出当前函数将异常传给调用当前函数的函数仍然以上图调用链为例 Quiz: function3抛出 Exception3执行哪些statement? 执行Process ex3 - statement6- statement3- statement4- statement1- statement2;Exception2执行哪些statement? 执行Process ex2 -statement4- statement1- statement2;Exception1执行哪些statement? 执行Process ex1 - statement2;Exception0执行哪些statement? 返回到主函数程序崩溃 3、异常传播的代价
C引入的异常处理会为程序带来额外开销和代价。 1项目中使用异常需要考虑与未使用异常的第三方和旧项目代码的整合问题避免出现一异常安全问题 2异常使用不当容易造成内存泄漏和程序崩溃比如函数内抛出异常需要注意栈展开导致的内存泄露析构函数抛出异常将程序置于不确定状态等 3异常的跳转会彻底扰乱程序的执行流程并难以判断给代码调试和维护增加难度 4为保证写出异常安全的代码往往需要借用C其它特性如智能指针这又进一步加剧了代码可读性的恶化与程序的时空开销包括编译时间的延长运行效率的较低以及代码尺寸的增大。