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