在 c++++ 中,錯誤處理和異常處理是處理意外狀況的不同機制。錯誤處理使用 errno 全局變量或 getlasterror() 函數設置錯誤碼,需由開發人員手動檢查錯誤。異常處理則拋出或捕獲異常對象,包含錯誤信息和類型,由編譯器自動處理錯誤傳播和恢復。主要差異包括:
C++ 函數錯誤處理與異常處理的差異
在 C++ 中,錯誤處理和異常處理是處理意外狀況的不同機制。
錯誤處理
使用 errno
全局變量(POSIX 標準)或 GetLastError()
函數(Windows API)設置一個錯誤碼。
開發人員負責檢查錯誤碼并采取適當的措施。
示例:
// 打開文件 FILE* fp = fopen("file.txt", "r"); // 檢查錯誤 if (fp == NULL) { int errnum = errno; // 根據 errnum 采取適當的措施 }
登錄后復制
異常處理
拋出或捕獲一組稱為異常的對象。異常對象包含有關錯誤的信息和類型。編譯器自動處理錯誤的傳播和恢復。示例:
class MyException : public exception { public: const char* what() const noexcept { return "This is an example exception."; } }; // 拋出一個異常 throw MyException(); // 捕獲異常 try { // 代碼可能拋出異常 } catch (MyException& e) { // 處理 MyException 異常 }
登錄后復制
關鍵差異
特征 | 錯誤處理 | 異常處理 |
---|---|---|
復雜性 | 低 | 高 |
控制 | 開發人員手動檢查錯誤 | 編譯器自動 |
信息 | 僅代碼 | 錯誤類型和信息 |
重用 | 無 | 可以創建自定義異常類型 |
性能 | 較快 | 較慢 |
實戰案例:文件操作
考慮使用文件操作的函數。我們可以在文件打開失敗時拋出 FileNotFoundException
異常,并在主程序中處理該異常。
// 定義文件未找到異常 class FileNotFoundException : public exception { public: const char* what() const noexcept { return "File not found."; } }; // 打開文件的函數 void openFile(const char* filename) { FILE* fp = fopen(filename, "r"); if (fp == NULL) { throw FileNotFoundException(); } } // 主程序 int main() { try { openFile("myfile.txt"); } catch (FileNotFoundException&) { cout << "File not found." << endl; } }
登錄后復制