例一:
#include<iostream> using namespace std; //double div(double x, double y) throw(int, double) //限制抛出的类型,如不匹配,直接抛给内核 //double div(double x, double y) throw() //直接抛给内核 double div(double x, double y) //没有限制 { if(y==0) throw "exception"; cout<<"div(x, y)"<<endl; return x/y; } void main() { try{ try{ divison(5, 0); } catch (int errcode){ cout << "div can't be 0!" << errcode << endl; //throw 10; throw;//继续抛一样的 } catch (double errcode){ cout << "div can't be 0.0!" << errcode << endl; //throw 10.0; throw; } catch (...){//其他类型异常 cout << "div can't be 0.0!" << endl; throw; } } catch (int errcode){ cout << "div can't be 0.0!" << errcode << endl; } catch (double errcode){ cout << "div can't be 0.0!" << errcode << endl; } catch (...){//其他类型异常 cout << "div can't be 0.0!" << endl; } cout << "main end!" << endl; }例二:异常嵌套
#include<iostream> using namespace std; double division(double x, double y) throw() { if (y == 0) //throw "exception"; throw 100; cout << "div(x,y)" << endl; return x / y; } void fun() { try{ division(5, 0); } catch (int errCode) { cout << "first exception, " << errCode << endl; throw; } } int main(void) { try{ fun(); } catch (int errCode){ cout << "catched exception, " << errCode << endl; } catch (double errCode){ cout << "catched exception, " << errCode << endl; } catch (...){//其他类型异常 cout << "catched ..." << endl; } cout << "main end" << endl; return 0; }例三:异常类
#include<iostream> using namespace std; class MyException { public: MyException(string errInfo="unknown", int errNo=0) :errInfo(errInfo), errNo(errNo) { cout<<"MyException()"<<endl; } ~MyException() { cout<<"~MyException()"<<endl; } MyException(const MyException &) { cout << "MyException(MyException&)" << endl; } void out() { cout<<"no:"<<errNo<<", info:"<<errInfo<<endl; } private: string errInfo; int errNo; }; void fun(int code) { if(code==110) { //throw MyException("terrist", 110);//首选,保证唯一性,且在传递时不会丢失 MyException temp("terrist", 110); throw temp; } if(code==120) { MyException *MyEx=new MyException("help", 120); throw MyEx; } if(code==119) { MyException MyEx("fire", 119); throw &MyEx; //不要返回局部变量的地址 } } main() { cout<<"please input errnun:"; int code; cin>>code; try{ fun(code); }/*catch(MyException &MyEx) //类型为MyException的异常将会--> { cout<<"reference"<<endl; MyEx.out(); }*/catch(MyException MyEx) //-->为MyException更早的处理者所捕获 { cout<<"value"<<endl; MyEx.out(); }catch(MyException *MyEx) { cout<<"pointer"<<endl; MyEx->out(); //对于120而言才需要; delete MyEx; } }