### 异常捕捉语句

在介绍异常捕捉前，我们先来编写一个能够引发异常的代码。

引发异常

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

{

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

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

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

cout << nRet << endl; //输出结果

return 0;

}

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

图 1 引发异常

在上面的代码中，由于语句“int nRet = nDiv / nDivisor;”导致除零的错误，引发了系统异常，导致程序中断。

为了防止程序由于意外的异常导致中断，可以使用异常捕捉语句来提前捕捉并处理异常，使得程序在产生异常时能够正常运行。在 C++语言中，为了处理异常，提供了 try 和 catch 语句。try 语句和 catch 语句实际上是一个语句块，try 语句块包含的是可能产生异常的代码，catch 语句块包含的是处理异常的代码。下面对上文中的程序代码进行修改，利用 try 和 catch 语句捕捉和处理异常。

捕捉异常

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

{

try //捕捉异常

{

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

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

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

cout << nRet << endl; //输出结果

}

catch(...) //处理异常

{

cout << "产生异常!" << endl;

}

return 0;

}

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

图 2 处理异常

从运行结果可以看出，当程序代码产生异常时，程序并没有中断，因为在程序代码（catch 语句部分）中处理了该异常。

在 try 语句块中，如果当前代码产生了异常，则 try 语句块中其后的代码将不会执行，程序直接跳转到 catch 语句块中。在上述的代码中“int nRet = nDiv / nDivisor;”语句引发了除零的异常，程序将执行 catch 语句块中的“cout << "产生异常!" << endl;”，而不会再执行 try 语句块中的“cout << nRet << endl;”语句，因此出现了如图 2 所示的结果。

在 catch 语句中出现了…符号，表示处理所有异常。如果 try 语句中没有产生异常，则不会执行 catch 语句块中的代码。实际上一个 try 语句可以对应多个 catch 语句，每一个 catch 语句可以关联一个异常类，当 try 语句块中产生的异常与 catch 语句关联的异常匹配时，将执行该 catch 语句块中的代码。

注意：try 部分的语句是可能出现错误的语句，该语句必须由大括号包含，即使只有一条语句。catch 部分的语句是处理异常的语句，该部分的语句也必须由大括号包含。在 try 程序段后，必须紧跟一个或多个 catch 程序段，这是 C++语法所要求的。每个 catch 程序段用于捕获一种类型的异常，并列的 catch 程序之间不许插入其他语句。