C++中处理异常的过程是这样的:在执行程序发生异常,可以不在本函数中处理,而是抛出一个错误信息,把它传递给上一级的函数来解决,上一级解决不了,再传给其上一级,由其上一级处理。如此逐级上传,直到最高一级还无法处理的话,运行系统会自动调用系统函数terminate,由它调用abort终止程序。这样的异常处理方法使得异常引发和处理机制分离,而不在同一个函数中处理。这使得底层函数只需要解决实际的任务,而不必过多考虑对异常的处理,而把异常处理的任务交给上一层函数去处理。
示例:
#include <iostream> #include <exception> #include <typeinfo> #define EXIT_SUCCESS 1 #define EXIT_FAILURE 0 using namespace std; //自定义异常类 class MyException : public exception { public: MyException(string ErrMsg):m_ErrMsg(ErrMsg) {} ~MyException() throw () {} //throw():不抛出异常(即没有异常) //重写父类what()函数,输出异常信息 const string& what() throw() { return m_ErrMsg; } private: string m_ErrMsg; //异常描述 }; //Div()函数存在MyException异常 int Div(int x,int y) throw (MyException) { if(0 == y) throw MyException("Div Zero"); if((typeid(x) != typeid(int)) || typeid(y) != typeid(int)) throw MyException("Not Intergter"); return x/y; } int main(void) { int nNum1,nNum2; nNum1 = nNum2 = 0; cout<<"Enter two Numbers:"<<endl; while(cin>>nNum1>>nNum2) { int nResult = 0; try { nResult = Div(nNum1,nNum2); } catch(MyException &err) { cerr<<err.what()<<endl; cout<<"Press y to Continue,n to Quit"<<endl; char yn = 0; if(cin>>yn,yn == 'n') break; } catch(...) //catch(...)表示捕获所有异常 { cerr<<"Exception occurs"<<endl; } cout<<nResult<<endl; } return EXIT_SUCCESS; }
下面对异常处理补充几点:(1)try和catch块中必须要用花括号括起来,即使花括号内只有一个语句也不能省略花括号;(2)try和catch必须成对出现,一个try_catch结果中只能有一个try块,但可以有多个catch块,以便与不同的异常信息匹配;(3)如果在catch块中没有指定异常信息的类型,而用删节号"...",则表示它可以捕获任何类型的异常信息;(4)如果throw不包括任何表达式,表示它把当前正在处理的异常信息再次抛出,传给其上一层的catch来处理;(5)C++中一旦抛出一个异常,如果程序没有任何的捕获,那么系统将会自动调用一个系统函数terminate,由它调用abort终止程序;