xx市院门户网站建设方案,营销软文300字范文,给个免费的网址,做签名照的网站1. 异常
异常通常用于处理逻辑上可能发生的错误
在C98中#xff0c;提供了一套完善的异常处理机制#xff0c;直接在程序中将各种类型的异常抛出#xff0c;从而强制终止程序的运行。
1.1 基本语法 当函数抛出异常时#xff0c;程序会停止执行#xff0c;并显示异常信息…1. 异常
异常通常用于处理逻辑上可能发生的错误
在C98中提供了一套完善的异常处理机制直接在程序中将各种类型的异常抛出从而强制终止程序的运行。
1.1 基本语法 当函数抛出异常时程序会停止执行并显示异常信息。异常处理程序可以通过catch语句捕获并处理异常。如果程序没有捕获异常程序将终止。
在C中栈的解旋是在try块中的函数调用完毕后自动完成的。这意味着在try块中的函数调用可能会抛出异常但不会影响栈的解旋。在catch块中处理异常时栈的解旋会被暂停直到catch块处理完毕后栈的解旋才会恢复。
#include iostream
using namespace std;
void func() {int x 10;int* p x;*p 20;throw *p;
}void catch_func(int a) {std::cout Caught exception: a std::endl;
}int main() {try {func();} catch (int e) {catch_func(e);}return 0;
}
hehedaheheda:~/Linux/c11$ g 8.noexcept.cpp -o app
hehedaheheda:~/Linux/c11$ ./app
Caught exception: 20
【总结】noexcept | 爱编程的大丙 (subingwen.cn)
异常被抛出后从进入try块起到异常被抛掷前这期间在栈上构造的所有对象都会被自动析构。析构的顺序与构造的顺序相反。这一过程称为栈的解旋。----来自爱编程的大丙
1.2 异常接口声明
① 显示指定可以抛出的异常类型
divide 函数后添加了 throw 异常接口声明其参数可以表示抛出的异常类型分别为 int 和 MyException 类型
#include iostream
using namespace std;struct MyException {MyException(string str):msg(str) {}string msg;
};double divide(int a, int b) throw(MyException,int) {if(b 0) {throw MyException(divide by zero);}return a / b;
}int main() {try{double val divide(10, 0);cout value: val endl;}catch(int e) {cout catch except: e endl;}catch(MyException e) {cout catch except: e.msg endl;}return 0;
}
运行结果
catch except: divide by zero
② 不抛出任何异常
#include iostream
using namespace std;struct MyException {MyException(string str):msg(str) {}string msg;
};double divide(int a, int b) throw() {if(b 0) {throw MyException(divide by zero);}return a / b;
}int main() {try{double val divide(10, 0);cout value: val endl;}catch(int e) {cout catch except: e endl;}catch(MyException e) {cout catch except: e.msg endl;}return 0;
}
在divide 函数后添加了throw异常接口声明其参数列表为空表示该函数不允许抛出异常
2. noexcept
double divisionMethod(int a, int b) noexcept(常量表达式); ① 简单地在函数声明后加上 noexcept 关键字 ② 可以接受一个常量表达式作为参数常量表达式的结果会被转换成一个bool类型的值 - 值为 true表示函数不会抛出异常 - 值为 false表示有可能抛出异常这里 - 不带常量表达式的noexcept相当于声明了noexcepttrue即不会抛出异常 noexcept | 爱编程的大丙 (subingwen.cn) ----来自爱编程的大丙 在C11中弃用了例如上文的动态异常声明 throw(MyException, int)这一特性表示函数不会抛出异常的动态异常声明 throw() 也被新的 noexcept 异常声明所取代
noexcept是C11中引入的一个关键字用于指定函数抛出异常的情况。当函数声明中使用noexcept时编译器可以推断函数不会抛出异常从而提高代码的执行效率。
noexcept 与 throw动态异常声明的区别
① 基于异常机制的throw()会带来一些额外的开销若出现函数抛出异常会导致函数栈被依次地展开栈解旋并自动调用析构函数栈上的所有函数
② noexcept 修饰的函数如果抛出了异常编译器可以选择直接调用 std::terminate() 函数来终止程序的运行这比基于异常机制的 throw() 在效率上会高一些
#include iostream
using namespace std;
void func() noexcept {std::cout This function does not throw exceptions std::endl;
}int main() {try {func();} catch (...) {std::cout Exception caught std::endl;}return 0;
}
在这个例子中func函数使用noexcept关键字指定因此编译器可以推断出函数不会抛出异常从而提高代码的执行效率。而main函数中的func调用不会抛出异常因此程序可以正常运行。
#include iostream
using namespace std;double divide(int a, int b) noexcept {if(b 0) {cout divide by zero!!! endl;return -1;}return a / b;
}int main() {try{double val divide(10, 0);cout value: val endl;}catch(int e) {cout catch except: e endl;}return 0;
}
hehedaheheda:~/Linux/c11$ g -stdc11 8.noexcept.cpp -o app
hehedaheheda:~/Linux/c11$ ./app
divide by zero!!!
value: -1