异常处理实例

来源:互联网 发布:码字软件 编辑:程序博客网 时间:2024/05/16 04:34

异常处理实例:

#include <iostream>#include <string>using namespace std;class MyException{public:    MyException(const string&message):        message(message) {}    ~MyException() {}    const string &getMessage() const    {        return message;    }private:    string message;};class Demo{public:    Demo()    {        cout<<"Constructor of Demo"<<endl;    }    ~Demo()    {        cout<<"Destructor of Demo"<<endl;    }};void func()throw (MyException)/*异常接口声明:可以在函数的声明中列出这个函数可能抛掷的所有异常类型.若不写异常接口声明,则此函数可以抛掷任何类型的异常。不抛掷任何类型异常的函数声明如下:void fun() throw();*/{    Demo d;    cout<<"Throw MyExpection in func"<<endl;    throw MyException("exception thrown by func()");///被main中catch接受,赋给e}int main(){    cout<<"In main function"<<endl;    try{func();}    catch(MyException&e)    {        cout<<"Caught an exception: "<<e.getMessage()<<endl;    }    cout<<"Resume the execution of main()"<<endl;    return 0;}

#include <bits/stdc++.h>using namespace std;void f2();void f3();void f1(){    try{f2();}    catch(char)    {        cout<<"OK1!";    }    cout<<"END1"<<endl;}void f2(){    try{f3();}    catch(int)    {        cout<<"OK2!"<<endl;    }    cout<<"END2"<<endl;}void f3(){    double a=0;    try {throw a;}    catch(float)    {        cout<<"OK3!"<<endl;    }    cout<<"END3"<<endl;}int main(){    try {f1();}    catch(double)    {        cout<<"OK0!"<<endl;    }    cout<<"END0"<<endl;    return 0;}

1)在main函数的try块中调用f1函数,在f1函数的try块中调用f2函数,在f2函数的try块中义调用f3函数。2)在执行f3函数过程中执行了throw语句,抛出double型异常信息a。由于在f3中没找到和a类型相匹配的catch子句,于是将a抛给f3的调用者f2函数,在f2没有找到和a类型相匹配的catch子句,又将a抛给f2的凋用者f1函数,在f1中没找到和a类刷相匹配的catch子句,又将a抛给f1的调用者main函数。3)而main函数中的try—catch结构中找到和a类型相匹配的catch子句,main中的catch子句就是离throw最近的且与之匹配的catch广句,执行该子句的复合语句,输出”OK0!”,再执行该catch 后的 cout语句。
1、异常处理的语法格式:    1)  throw   表达式;     2)try----catch的结构:          try               {被检查的语句}          catch(异常信息类型)               {进行异常处理的语句}  说明:     (1)被检测的函数调用必须放在try块中,否则不起作用。     (2)try块和catch块作为一个整体出现,catch块是try--catch结构中的一部分,必须紧跟跟在try块之后,不能单独使用,在二者之间不能插入其它语句,

(3)try和catch块必须用花括号括起来的复合语句,即使花括号内只有一个语句也不能省略{ }。(4)一个try—catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配;    例如:try {  }                catch  (double)                catch  (int)                catch  (char)                   ……….(5)catch后面的圆括号中只写异常信息的类型名,catch只检查所捕获异常信息的类型,而不检查它们的值,例如a,b,c都是double 类型,虽然它们的值不同,但在throw语句中写成throw a、throw b或throw c,作用均相同。注意:异常信息可以是C++预定义的标准类型,也可以是用户自定义的类型(类或结构体)。

(6)如果在catch子句中没指定异常信息类型,而是用“…”,例如  :       Catch(…){cout<<“ok”<<endl;}       表示可以捕捉任何类型的异常信息。  注意:这种catch子句应放在所有try--catch结构的最后,相当于其它。如果把它作为第一个catch 子句,则其后的catch字句均不起作用。(7)try—catch结构可以与throw出现在同一个函数中,也可以不出现在同一个函数中,若本函数无catch,则转到上一级处理。

异常借口声明:可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:void fun() throw(A,B,C,D);若无异常接口声明,则此函数可以抛掷任何类型的异常。不抛掷任何类型异常的函数声明如下:void fun() throw();


原创粉丝点击