首页 > 编程 > C++ > 正文

C++中的异常处理

2019-11-08 02:34:19
字体:
来源:转载
供稿:网友

异常的简介和基本使用

异常就是运行时出现的不正常,例如运行时耗尽了内存或遇到意外的非法输入,异常存在于程序的正常功能之外,并要求程序立即处理,不能不处理异常,常是足够重要的,使程序不能继续正常执行的事件,如果找不到匹配的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段抛出一个异常并捕捉,代码如下:

#include<exception> #include<iostream> using namespace std; //customized exception class 'myException': class myException:public exception { public: myException():exception("ERROR! Don't divide a number by integer zero./n"){ } //C++标准不建议这样做 myException() { cout<<"error"<<endl; }}; //entry of the application: int main() { int x=100,y=0; try { if(y==0) throw myException(); else cout<<x/y; } catch(myException& me) { cout<<me.what(); //返回用来在抛出位置构造异常对象的信息 //输出error和std:exception } system("pause"); return 0; } //运行结果如下:ERROR! Don't divide a number by integer zero.
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选