### 抛出异常

异常不仅可以由系统自动触发（由执行的程序代码所致），也可以由用户自己触发异常。自己触发异常的好处是用户可以定制自己的逻辑规则。例如，当用户的某一项操作不符合业务规则时，我们可以自定义一个异常，在该情况发生时触发异常，交由异常处理语句进行相应处理。

C++语句提供了 throw 关键字用于触发异常。下例中，如果除数为 0，则使用 throw 关键字抛出异常。

抛出异常

int main(int argc, char* argv[])

{

try

{

int nDiv = 100; //定义一个整数，初始化为 100

int nDivisor = 0; //定义一个整数，初始化为 0

if (nDivisor <= 0) //如果除数小于等于 0

{

throw "除数必须大于 0!"; //抛出异常

}

int nRet = nDiv / nDivisor; //进行触发运算

cout << nRet << endl;

}

catch(...) //异常捕捉

{

cout << "运算失败!" << endl;

}

return 0;

}

运行程序，效果如图 1 所示。

图 1 抛出异常

上述代码中，用户定义了自己的一个除法规则，即如果除数为负数，将触发异常，执行 catch 语句块中的代码。

在程序中，throw 语句通常出现在 try 语句块中，当程序中出现 throw 语句时，其后的代码将不会执行，程序将跳转到 catch 语句块中。因此，上述代码中的“int nRet = nDiv / nDivisor;”语句和“cout << nRet << endl;”语句不会被执行。下面笔者编写一个除法函数，演示如何自定义异常和触发异常。

自定义异常类

首先定义两个异常类。

class CDivZeroException //定义一个除零的异常类

{

public:

char ExceptionMsg[128]; //定义数据成员

CDivZeroException() //定义构造函数

{

strcpy(ExceptionMsg,"除零错误"); //设置异常信息

}

};

class CNegException //定义一个负数异常类

{

public:

char ExceptionMsg[128]; //定义数据成员

CNegException() //定义构造函数

{

strcpy(ExceptionMsg,"除数为负数错误"); //设置异常信息

}

};

然后定义一个除法函数。

bool Div(int nDiv ,int nDivisor, int &nRet) //定义除法函数

{

try //异常捕捉

{

if (nDivisor == 0) //判断除数是否为 0

throw CDivZeroException(); //抛出异常

else if ( nDivisor < 0) //判断除数是否为负数

throw CNegException(); //抛出异常

else

nRet = nDiv / nDivisor; //进行除法运算

}

catch(CDivZeroException e) //捕捉除零的异常

{

cout << e.ExceptionMsg << endl; //输出异常信息

return false;

}

catch(CNegException e) //捕捉除数为负数的异常

{

cout << e.ExceptionMsg << endl; //输出异常信息

return false;

}

return true;

}

最后在 main 函数中调用 Div 函数。

int main(int argc, char* argv[])

{

int nRet; //定义一个变量

bool bRet = Div(100, -2, nRet); //调用 Div 函数

return 0;

}

运行程序，效果如图 2 所示。

图 2 自定义异常

从图 2 中可以发现，语句“bool bRet = Div(100, -2, nRet);”触发了自定义的异常 CNegException。