#include <iostream>
// 1.noexcept修饰函数表示不会有异常,若修饰过函数抛出异常,编译器会使用std::terminate()
// 来立即终止程序运行
// 抛出异常
auto may_throw() {
throw true;
}
// noexcept修饰函数, 等价noexcept(true), noexcept(false)-和不加noexcept等价
auto no_throw() noexcept{
return;
}
auto may_block_throw=[](){
may_throw();
};
auto no_block_throw=[]() noexcept{
no_throw();
};
// 2.使用noexcept修饰表达式,当表达式无异常则返回true,否则false;
void Test(){
std::cout<<std::boolalpha;
std::cout<< noexcept(may_throw())<<std::endl; // false
std::cout<< noexcept(no_throw())<<std::endl; // true
std::cout<< noexcept(may_block_throw())<<std::endl; // false
std::cout<< noexcept(no_block_throw())<<std::endl; // true
}
// 3. noexcept 修饰完一个函数之后能够起到封锁异常扩散的功效,如果内部产生异常,外部也不会触发
auto func1=[]() noexcept{
may_throw();
};
auto func2=[](){
may_throw();
};
void Test1(){
// try{
// func1(); // func1中may_throw函数抛出异常,func1被noexcept修饰后会terminate
// }
// catch(...) {
// std::cout<<"B throw"<<std::endl; // should be not here
// }
try{
func2(); // func2中may_throw函数抛出异常,func2也会抛出异常,这就是异常扩散
}
catch(...) {
std::cout<<"func2 throw"<<std::endl; // should be here
}
}
int main()
{
Test1();
return 0;
}