【C++基础】重抛异常与异常的使用场景

358 阅读1分钟

重抛异常

异常处理程序可以重新抛出异常。
当它无法处理该异常,或想通知它的调用者发生了一个异常,此时就需要重抛异常:
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、实时系统中不用异常(航天飞机控制程序、生命维持系统等)