重抛异常
异常处理程序可以重新抛出异常。
当它无法处理该异常,或想通知它的调用者发生了一个异常,此时就需要重抛异常:
1、抛出捕获的异常
try {// statements;
}
catch (TheException &ex) {// Do something;throw;
}
2、重新抛出另一个不同于已经捕获异常:
class MyException: public logic_error { };try {throw logic_error(); // 抛出派生异常对象
} catch (logic_error& e) { // catch参数为基类异常,但可以捕获所有派生类异常对象//MyException* p = dynamic_cast<MyException*>(&e); // 转指针失败不会再抛异常MyException& p = dynamic_cast< MyException&>(e); // 引用转换失败会抛 std::bad_cast异常cout << p.what() << endl; // 上面抛异常,本语句被跳过
}
异常的使用场景
1、当一个外部的问题阻止你的程序运行时,抛异常:
如:(第三条的笑话真冷。。。)
(1) 从服务器接收到非法数据(2) 磁盘满了(3) 宇宙射线阻止你查询数据库
2、如果函数无法完成它所告知的功能并建立其正常的后置状态,抛异常
构造函数失败。例如vector的构造函数应创建一个对象,但对象占内存太大导致无法构建,那么应该抛异常
何时不使用异常
1、只发生在单独函数中的简单错误不要用异常处理
2、不要用异常处理编码错误,可以用assert()中断程序执行然后调试
3、不要用异常来控制程序流程,不要用throw来结束循环
4、实时系统中不用异常(航天飞机控制程序、生命维持系统等)