Dalam C++, pengendalian ralat dan pengendalian pengecualian adalah mekanisme yang berbeza untuk mengendalikan keadaan yang tidak dijangka. Pengendalian ralat menggunakan pembolehubah global errno atau fungsi GetLastError() untuk menetapkan kod ralat dan pembangun perlu menyemak ralat secara manual. Pengendalian pengecualian melontar atau menangkap objek pengecualian, termasuk maklumat dan jenis ralat, dan pengkompil secara automatik mengendalikan penyebaran dan pemulihan ralat. Perbezaan utama termasuk:
Perbezaan antara pengendalian ralat fungsi dan pengendalian pengecualian dalam C++
Dalam C++, pengendalian ralat dan pengendalian pengecualian adalah mekanisme yang berbeza untuk mengendalikan keadaan yang tidak dijangka.
Ralat pengendalian
errno
pembolehubah global (POSIX standard) atau fungsi GetLastError()
(Windows API) untuk menetapkan kod ralat. 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
Pembangun bertanggungjawab untuk menyemak kod ralat dan mengambil tindakan yang sewajarnya.
// 定义文件未找到异常 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; } }
FileNotFoundException
apabila pembukaan fail gagal dan mengendalikan pengecualian dalam program utama. 🎜rreeeeAtas ialah kandungan terperinci Apakah perbezaan antara pengendalian ralat fungsi C++ dan pengendalian pengecualian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!