zoukankan      html  css  js  c++  java
  • C++——异常处理

    程序的异常处理是使得程序具有一定的容错性,是指允许给运行环境或者人为因素的一些错误的提示或处理。其基本思想:每一个函数要负责发现异常,不必去处理错误,但是需要构造一个异常对象向调用者抛出该异常。该调用者查看异常对象,判断是否能够解决,给用户提示;如果处理不了,则需要继续向更上一级的调用者抛出异常,如此类推,直至抛掷给操作系统,终止程序。主要见下图:

    25、异常处理
    异常处理的实现机制:提示异常并捕获处理异常。

    抛弃异常的程序:throw 表达式;
    捕获并处理:try 复合语句 catch(异常类型声明 )复合语句……

    若有异常则通过throw操作创建一个异常对象并抛掷。
    将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
    如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
    catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
    如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。

    //处理除0异常
    #include<iostream>
    using namespace std;
    int Div(int x,int y);
    int main()
    {
     try
     {
      cout<<"5/2="<<Div(5,2)<<endl;
      cout<<"8/0="<<Div(8,0)<<endl;
      cout<<"7/1="<<Div(7,1)<<endl;
     }
     catch(int)
     {
      cout<<"except of deviding zero. ";
     }
     cout<<"that is ok. ";
    }
    int Div(int x,int y)
    {
     if(y==0)
      throw y;
     return x/y;
    }//程序运行结果如下:
    5/2=2
    except of deviding zero.
    that is ok.
    异常接口声明:可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例:void fun() throw(a,b,c);

    如果没有异常接口,则此函数可以抛掷任何异常。不抛掷任何类型异常的函数声明如下:void fun() throw();
    异常处理中的构造和析构:找到一个匹配的catch异常处理后,初始化参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。
    //构造和析构

    #include <iostream>
    using namespace std;
    void MyFunc( void );
    class Expt
    {
      public:
        Expt(){};
        ~Expt(){};
        const char *ShowReason() const
        {
         return "Expt类异常。";
      }
    };
    class Demo
    {
      public:
        Demo();
        ~Demo();
    };
    Demo::Demo()
    {
        cout << "构造 Demo." << endl;
    }
    Demo::~Demo()
    {
        cout << "析构 Demo." << endl;
    }
    void MyFunc()
    {
        Demo D;
        cout<< "在MyFunc()中抛掷Expt类异常。" << endl;
        throw Expt();
    }
    int main()
    {
        cout << "在main函数中。" << endl;
        try
        {
            cout << "在try块中,调用MyFunc()。" << endl;
            MyFunc();
        }
        catch( Expt E )
        {
            cout << "在catch异常处理程序中。" << endl;
            cout << "捕获到Expt类型异常:";
            cout << E.ShowReason() << endl;
        }
        catch( char *str )
        {
            cout << "捕获到其它的异常:" << str << endl;
        }
        cout << "回到main函数。从这里恢复执行。" << endl;
        return 0;
    }//程序运行时输出:
    在main函数中。
    在try块中,调用MyFunc()。
    构造 Demo.
    在MyFunc()中抛掷Expt类异常。
    析构 Demo.
    在catch异常处理程序中。
    捕获到Expt类型异常:Expt类异常。
    回到main函数。从这里恢复执行。

  • 相关阅读:
    javascript与XML
    错误调试
    Js节点操作
    vue渲染时对象里面的对象的属性提示undefined,但渲染成功
    html5脚本编程
    用canvas把页面中所有元素的轮廓绘制出来
    HTTP的三次握手
    http协议的发展历史
    5层网络模型介绍
    http主要内容流程介绍
  • 原文地址:https://www.cnblogs.com/lemaden/p/10238086.html
Copyright © 2011-2022 走看看