异常处理实例

异常处理实例:

#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();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值