Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengendalian pengecualian dan penentu pengecualian untuk fungsi C++

Pengendalian pengecualian dan penentu pengecualian untuk fungsi C++

WBOY
WBOYasal
2024-04-12 17:33:02661semak imbas

Pengendalian pengecualian mengendalikan ralat masa jalan, termasuk membaling, menangkap dan mengendalikan pengecualian. Penentu pengecualian digunakan untuk menentukan jenis pengecualian yang boleh dilemparkan oleh fungsi, termasuk noexcept(expr) (menentukan bahawa tiada pengecualian dilemparkan) dan throw() (menentukan bahawa sebarang jenis pengecualian boleh dilemparkan). Dalam kes sebenar, fungsi print_file menggunakan penentu throw() dan menggunakan blok try-catch untuk menangkap pengecualian std::runtime_error dalam fungsi utama dan mengendalikan ralat pembukaan fail.

C++ 函数的异常处理和异常说明符

Pengendalian pengecualian dan penentu pengecualian fungsi C++

Pengendalian pengecualian ialah mekanisme utama untuk mengendalikan ralat masa jalan Ia terbahagi kepada tiga bahagian: pengecualian lemparan, pengecualian penangkapan dan pengecualian pengendalian. Dalam C++, pengecualian diwakili oleh kelas pengecualian.

Lempar pengecualian

Gunakan kata kunci lempar untuk membuang pengecualian. Kelas pengecualian atau sebarang objek dengan fungsi tertentu boleh berfungsi sebagai pengecualian. Contohnya: throw 关键字抛出异常。异常类或具有特定功能的任意对象都可以作为异常。例如:

throw std::runtime_error("失败!");

捕获异常

使用 try-catch 块捕获异常。try 块包含可能抛出异常的代码,而 catch 块指定如何处理不同类型的异常。例如:

try {
  // 可能抛出异常的代码
} catch (const std::runtime_error& e) {
  // 处理 std::runtime_error 异常
} catch (const std::exception& e) {
  // 处理所有其他异常
}

异常说明符

异常说明符添加到函数签名中,以指定函数可以抛出的异常类型。有两种异常说明符:

  • noexcept(expr):指定函数不抛出任何异常,其中 expr 为常量表达式。
  • throw():指定函数可以抛出任何类型的异常。

实战案例

考虑一个读取文件并将其打印到控制台的函数。该函数可能会由于文件不存在或访问被拒绝而引发异常。我们可以使用异常说明符和 try-catch 块来处理这些情况。

#include <iostream>
#include <fstream>

void print_file(const std::string& file_name) {
  std::ifstream file(file_name);
  if (!file.is_open()) throw std::runtime_error("无法打开文件!");

  std::string line;
  while (std::getline(file, line)) {
    std::cout << line << std::endl;
  }
}

int main() {
  try {
    print_file("test.txt");
  } catch (const std::runtime_error& e) {
    std::cerr << e.what() << std::endl;
  }

  return 0;
}

在函数 print_file 中,异常说明符 throw() 指定该函数可以抛出任何类型的异常。在 main 函数中,我们使用 try-catch 块来处理异常。如果打开文件时发生错误,则会抛出 std::runtime_errorrrreee

🎜Catch exceptions🎜🎜🎜Gunakan try-catch blok untuk menangkap pengecualian. Blok try mengandungi kod yang mungkin membuang pengecualian, manakala blok catch menentukan cara mengendalikan pelbagai jenis pengecualian. Contohnya: 🎜rrreee🎜🎜Penentukan pengecualian 🎜🎜🎜Penentukan pengecualian ditambahkan pada tandatangan fungsi untuk menentukan jenis pengecualian yang boleh dilemparkan oleh fungsi. Terdapat dua penentu pengecualian: 🎜
  • 🎜noexcept(expr)🎜: Fungsi yang ditentukan tidak membuang sebarang pengecualian, dengan expr ialah ungkapan tetap.
  • 🎜throw()🎜: Fungsi yang ditentukan boleh membuang sebarang jenis pengecualian.
🎜🎜Contoh Praktikal🎜🎜🎜Pertimbangkan fungsi yang membaca fail dan mencetaknya ke konsol. Fungsi ini mungkin membuang pengecualian kerana fail tidak wujud atau akses dinafikan. Kami boleh menggunakan penentu pengecualian dan blok try-catch untuk mengendalikan situasi ini. 🎜rrreee🎜Dalam fungsi print_file, penentu pengecualian throw() menentukan bahawa fungsi itu boleh membuang sebarang jenis pengecualian. Dalam fungsi utama, kami menggunakan blok try-catch untuk mengendalikan pengecualian. Jika ralat berlaku semasa membuka fail, pengecualian std::runtime_error dilemparkan dan mesej ralat dicetak ke konsol. 🎜

Atas ialah kandungan terperinci Pengendalian pengecualian dan penentu pengecualian untuk fungsi C++. 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