- catch(...)捕获所有异常
- 有时在catch(){}中使用throw;表示不对捕获的异常做任何处理,只是再抛出异常 将throw;空语句放在catch块之外,执行这种throw会调用terminate。
- 将带void*参数类型的异常处理器放在具有其他指针类型的异常处理器前是个逻辑错误,因为他将捕获所有异常,后面的根本不起作用。
- try块不抛出任何异常而正常地执行完毕时,控制传入try块后面最后的一个catch处理器之后的第一条语句而不是try块后的第一条语句
- catch块本生也可以抛出异常,但此异常的处理是由外层try块中的异常处理器处理。
- 异常指定可以由指定函数抛出一列异常:
int g( float h) throw(a, b, c)
{...}
这可以限定从函数抛出的异常类型。事实上这也可以抛出其他异常类型,此时调用unexpected。
若throw()为空,表示不抛出异常,但事实上还是可以抛出异常,不过调用unexcepted利用异常机制可以捕获每格派生类异常对象的指针或引用,但更简练的方法是捕获异常对象的指针和引用。这样可以避免错误。另外我们可以通过设置对象的属性来区分异常
再抛出异常示例:
#include<iostream>
#include<exception>
using namespace std;
void throwException() throw (exception)
{
try
{
cout << "Function throwException/n";
throw exception();
}
catch(exception e)
{
cout<<"Exception handled in function throwException/n";
throw;
}
}
int main()
{
try
{
throwException();
cout << "this shoule not print/n";
}
catch(exception e)
{
cout << "Exception handled in main/n";
}
cout << "Program control continues after catch in main" << endl;
return 0;
}
}