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终止程序;