重拋異常
異常處理程序可以重新拋出異常。
當它無法處理該異常,或想通知它的調用者發生了一個異常,此時就需要重拋異常:
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、實時系統中不用異常(航天飛機控制程序、生命維持系統等)