Rumah >pembangunan bahagian belakang >C++ >Apakah perbezaan antara pengendalian ralat fungsi C++ dan pengendalian pengecualian?

Apakah perbezaan antara pengendalian ralat fungsi C++ dan pengendalian pengecualian?

WBOY
WBOYasal
2024-04-24 08:00:01479semak imbas

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:

C++ 函数错误处理与异常处理有何区别?

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

  • Gunakan 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 异常
}

关键差异

特征 错误处理 异常处理
复杂性
控制 开发人员手动检查错误 编译器自动
信息 仅代码 错误类型和信息
重用 可以创建自定义异常类型
性能 较快 较慢

实战案例:文件操作

考虑使用文件操作的函数。我们可以在文件打开失败时抛出 FileNotFoundExceptionPembangun bertanggungjawab untuk menyemak kod ralat dan mengambil tindakan yang sewajarnya.

Contoh:
// 定义文件未找到异常
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;
  }
}
🎜🎜Pengendalian pengecualian🎜🎜🎜🎜Melempar atau menangkap satu set objek yang dipanggil pengecualian. 🎜Objek pengecualian mengandungi maklumat tentang ralat dan jenisnya. 🎜Pengkompil secara automatik mengendalikan penyebaran ralat dan pemulihan. 🎜Contoh: rrreee🎜🎜Perbezaan utama🎜🎜 Ciri Pengendalian ralat Pengendalian pengecualian Kerumitan Rendah Tinggi Kawalan Pembangun menyemak ralat secara manual Pengkompil secara automatik Maklumat Kod sahaja Jenis ralat dan maklumat Guna semula Tiada Jenis pengecualian tersuai boleh dibuat td> Prestasi Pantas Lebih perlahan 🎜 🎜Kes praktikal: Operasi fail🎜🎜🎜Pertimbangkan untuk menggunakan fungsi pengendalian fail. Kita boleh membuang pengecualian FileNotFoundException apabila pembukaan fail gagal dan mengendalikan pengecualian dalam program utama. 🎜rreeee

Atas 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn