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