异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入,异常存在于程序的正常功能之外,并要求程序立即处理,不能不处理异常,常是足够重要的,使程序不能继续正常执行的事件,如果找不到匹配的catch,程序就调用库函数terminate
下面是处理异常的代码:
#include<iostream> using namespace std; void func1(){ throw 3.0;}void func2(){ throw string("no"); //throw "出错,除数为0了";使用catch(char *s)捕获}void func3(){ throw IndexException();}int main() { try{ int a=3,b=0; int c=a/b; } catch(...){ } //这里catch后圆括号中的...指的是捕获所有异常 //func1()的异常捕获处理: try{ func1(); } catch(double){ } //使用catch(double &a){ cout<<a<<endl;输出3.0 } //func2()的异常捕获处理: try{ func2(); } catch(string& val){ cout<<val<<endl; //输出"no" } //func3()的异常捕获: try{ func3(); } catch(IndexException &e){ e.PRintException();//异常提示信息的输出,输出:提示:下标越界 } //若是catch(Exception &e){ },打印结果一样 return 0; }抛出异常的时候,将暂停当前函数的执行,检查与该try相关的catch子句,看是否其中之一与被抛出对象相匹配,如果找到匹配的catch,就处理异常,如果找不到,就退出当前函数(释放当前函数的内存并撤销局部对象),并且继续在调用这个函数的函数中查找,释放当前内存并撤销局部对象,这时会调用对象的析构函数,如果析构函数抛出异常,将会调用标准库terminate函数,强制整个程序非正常退出,所以析构函数应该从不抛出异常
异常的层次如下图:
C++标准中,定义在<stdexcept>
中的任何异常类都派生自exception Class,本例也只是简单地由exception继承,在try段抛出一个异常并捕捉,代码如下:
新闻热点
疑难解答
图片精选