異常處理處理運(yùn)行時(shí)錯(cuò)誤,包括拋出、捕獲和處理異常。異常說明符用于指定函數(shù)可以拋出的異常類型,包括 noexcept(expr)(指定不拋出異常)和 throw()(指定可以拋出任何類型異常)。實(shí)戰(zhàn)案例中,print_file 函數(shù)使用 throw() 說明符,并使用 try-catch 塊在 main 函數(shù)中捕獲 std::runtime_error 異常,并處理文件打開錯(cuò)誤。
C++ 函數(shù)的異常處理和異常說明符
異常處理是處理運(yùn)行時(shí)錯(cuò)誤的關(guān)鍵機(jī)制,它分為三個(gè)部分:拋出異常、捕獲異常和處理異常。在 C++ 中,異常通過異常類表示。
拋出異常
使用 throw
關(guān)鍵字拋出異常。異常類或具有特定功能的任意對象都可以作為異常。例如:
throw std::runtime_error("失敗!");
登錄后復(fù)制
捕獲異常
使用 try-catch
塊捕獲異常。try
塊包含可能拋出異常的代碼,而 catch
塊指定如何處理不同類型的異常。例如:
try { // 可能拋出異常的代碼 } catch (const std::runtime_error& e) { // 處理 std::runtime_error 異常 } catch (const std::exception& e) { // 處理所有其他異常 }
登錄后復(fù)制
異常說明符
異常說明符添加到函數(shù)簽名中,以指定函數(shù)可以拋出的異常類型。有兩種異常說明符:
noexcept(expr):指定函數(shù)不拋出任何異常,其中 expr
為常量表達(dá)式。throw():指定函數(shù)可以拋出任何類型的異常。
實(shí)戰(zhàn)案例
考慮一個(gè)讀取文件并將其打印到控制臺的函數(shù)。該函數(shù)可能會由于文件不存在或訪問被拒絕而引發(fā)異常。我們可以使用異常說明符和 try-catch
塊來處理這些情況。
#include <iostream> #include <fstream> void print_file(const std::string& file_name) { std::ifstream file(file_name); if (!file.is_open()) throw std::runtime_error("無法打開文件!"); std::string line; while (std::getline(file, line)) { std::cout << line << std::endl; } } int main() { try { print_file("test.txt"); } catch (const std::runtime_error& e) { std::cerr << e.what() << std::endl; } return 0; }
登錄后復(fù)制
在函數(shù) print_file
中,異常說明符 throw()
指定該函數(shù)可以拋出任何類型的異常。在 main
函數(shù)中,我們使用 try-catch
塊來處理異常。如果打開文件時(shí)發(fā)生錯(cuò)誤,則會拋出 std::runtime_error
異常并在控制臺打印錯(cuò)誤消息。