异常的抛出与捕获

异常是程序在执行期间产生的问题,比如尝试除以零的操作。异常提供了一种转移程序控制权的方式。C++ 异常处理涉及到三个关键字:trycatchthrow

  • throw:当问题出现时,程序抛出一个异常
  • catch:在想要处理问题的地方,通过异常处理程序捕获异常
  • try:try块中的代码标识将被激活的特定异常。它后面通常跟着一个或多个 catch 块。

使用throw可以在一些特定的时候令程序抛出异常,比如当遇到除数是0的时候:

1
2
if(division == 0)
throw "division by zero condition!";

一个try……catch的写法通常是这这样的:

1
2
3
4
5
6
7
8
9
10
11
12
try
{
// protected codes
}
catch( ExceptionName e1 )
{
// catch block
}
catch( ExceptionName e2 )
{
// catch block
}

如果要捕获所有的异常,则需要在catch的括号中使用省略号:

1
2
3
4
5
6
7
8
try
{
// protected codes
}
catch( … )
{
// catch block
}

定义新的异常

可以通过继承和重载exception类来定义新的异常,比如像下边这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct MyException : public exception
{
const char * what() const throw()
{
return "New Exception";
}
};

try
{
throw MyException();
}
catch ( MyException& e)
{
cout << "MyException caught" << endl;
cout << e.what() << endl;
}
catch (exception& e)
{
// other exceptions
}