一、異常概述
異常是指程序執行時出現的意外或異常情況,如除數為0,文件不存在等。這些異常導致程序無法正常執行,甚至崩潰。C++中提供了異常處理機制,能夠在程序出現異常時進行捕獲和處理,讓程序更加健壯。
二、異常處理語句
C++中使用try-catch語句進行異常處理,通過捕獲異常並在catch語句中進行相應處理,使程序在出現異常時能夠繼續執行。
try { // 可能出現異常的代碼塊 } catch (ExceptionType e) { // 異常處理代碼 }
try語句塊中包含可能會拋出異常的代碼,當異常被拋出時,程序會跳轉到catch語句中進行異常處理。ExceptionType為自定義類型,捕獲指定類型的異常。catch語句可以有多個,分別處理不同類型的異常。
三、自定義異常
C++中可以自定義異常類型,用於區分不同的異常情況。自定義異常需要繼承自std::exception類,並重載其what()方法,返回異常的描述信息。
class CustomException : public std::exception { public: const char* what() const throw() { return "This is a custom exception"; } };
在程序中拋出自定義異常:
try { throw CustomException(); } catch (std::exception& e) { std::cout << e.what() << std::endl; // 輸出異常描述信息 }
四、異常傳遞
異常可以在函數間傳遞,用於在高層調用函數中處理異常。當函數中出現異常,程序跳轉到調用函數中進行異常處理,繼續將異常傳遞給調用函數,直到異常被處理或程序終止。
void func1() { try { func2(); // 調用函數2 } catch (std::exception& e) { std::cout << e.what() << std::endl; throw; // 拋出異常 } } void func2() { throw CustomException(); // 拋出自定義異常 }
在程序中調用函數1:
try { func1(); // 調用函數1 } catch (std::exception& e) { std::cout << e.what() << std::endl; }
五、異常安全
在程序中,異常可能會導致資源沒有釋放或部分釋放,造成資源泄露或錯誤。為了避免這種情況,可以使用異常安全的代碼。
異常安全的代碼分為三個級別,分別為:
- 基本異常安全(Basic exception safety):不會泄露資源,但程序狀態可能已被修改。
- 強異常安全(Strong exception safety):程序狀態和資源都不會發生改變。
- 不拋出異常保證(No-throw guarantee):不會發生異常。
為了實現強異常安全,可以使用RAII(資源獲取即初始化)技術,將資源的分配和釋放放在同一個類中進行,通過構造函數和析構函數來實現自動化管理。在異常發生時,調用析構函數自動釋放資源。
class Test { private: int* ptr; public: Test() { ptr = new int; } ~Test() { delete ptr; } };
在程序中使用RAII:
void func() { Test t; // RAII資源管理類 // 可能拋出異常的代碼 }
六、總結
通過C++異常處理機制,能夠讓程序在出現異常時進行捕獲和處理,提高程序的健壯性。通過自定義異常類型和異常傳遞,能夠進行更加詳細的異常處理。在編寫代碼時,需要考慮到異常安全,避免資源泄露和錯誤。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/232545.html