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






