Bagaimana untuk membahagikan hierarki pengecualian dalam pengendalian pengecualian fungsi C++?

WBOY
Lepaskan: 2024-04-15 18:48:02
asal
1095 orang telah melayarinya

Hierarki pengecualian dalam C++ menyediakan tahap pewarisan kelas pengecualian yang berbeza untuk mengklasifikasikan situasi pengecualian. Hierarki ini berakar pada kelas std::exception dan termasuk pengecualian asas, pengecualian masa jalan dan pengecualian logik yang lebih khusus diperoleh daripada kelas asas ini. Melalui mekanisme pengendalian pengecualian, pengecualian pada tahap yang berbeza boleh ditangkap dan langkah yang sepadan diambil mengikut keperluan.

C++ 函数异常处理中的异常层级如何划分?

Hierarki pengecualian dalam pengendalian pengecualian fungsi C++

Dalam C++, pengendalian pengecualian fungsi boleh melaporkan pengecualian dengan membuang objek pengecualian. Untuk mengklasifikasikan situasi pengecualian yang berbeza, C++ memperkenalkan hierarki pengecualian. Hierarki pengecualian ialah hierarki warisan kelas pengecualian yang ditakrifkan oleh perpustakaan standard yang menyediakan tahap maklumat yang berbeza untuk objek pengecualian.

1. Hierarki warisan kelas pengecualian

Hierarki pengecualian ialah hierarki warisan dengan kelas std::exception sebagai akarnya: std::exception 类为根的继承层次结构:

class std::exception {
public:
    virtual ~exception() noexcept = default;
    virtual const char* what() const noexcept = 0;
};

// 基本异常类
class std::runtime_error : public std::exception {
public:
    runtime_error(const char* whatArg) : whatArg_(whatArg) {}
    virtual const char* what() const noexcept override { return whatArg_; }

private:
    const char* whatArg_;
};

// 派生异常类
class std::logic_error : public std::runtime_error {
public:
    logic_error(const char* whatArg) : runtime_error(whatArg) {}
};
Salin selepas log masuk

2. 异常层级划分

异常层级将异常类分为不同的级别:

  • 基础异常 (std::exception):表示所有异常情况的基类。
  • 运行时异常 (std::runtime_error):表示在程序运行时发生的异常,例如内存分配失败或文件打开失败。
  • 逻辑异常 (std::logic_error):表示程序逻辑中的错误,例如非法参数或无效状态。

更具体的异常类从 std::runtime_errorstd::logic_error 衍生,例如:

  • std::bad_alloc:内存分配失败。
  • std::invalid_argument:无效参数。
  • std::range_error:范围错误(例如,数组下标越界)。

3. 实战案例

考虑以下函数:

int divide(int numerator, int denominator) {
    if (denominator == 0) {
        throw std::invalid_argument("denominator cannot be zero");
    }
    return numerator / denominator;
}
Salin selepas log masuk

denominator 为 0 时,此函数抛出 std::invalid_argument 异常。该异常属于 std::logic_error 层级,表示程序逻辑中一个无效的参数错误。

在调用 divide 函数时,你可以使用异常处理机制来捕获异常:

try {
    int result = divide(10, 2);
    std::cout << "Result: " << result << std::endl;
} catch (const std::invalid_argument& e) {
    std::cerr << "Error: " << e.what() << std::endl;
}
Salin selepas log masuk

在这种情况下,当 denominator 为 0 时,将捕获 std::invalid_argumentrrreee

🎜2 hierarki pengecualian hierarki Bahagikan kelas pengecualian kepada tahap yang berbeza: 🎜
  • 🎜Pengecualian Asas (std::exception)🎜: Kelas asas yang mewakili semua situasi pengecualian.
  • 🎜Pengecualian runtime (std::runtime_error)🎜: Menunjukkan pengecualian yang berlaku semasa program berjalan, seperti kegagalan peruntukan memori atau kegagalan membuka fail.
  • 🎜Pengecualian logik (std::logic_error)🎜: Menunjukkan ralat dalam logik program, seperti parameter haram atau status tidak sah.
🎜Lebih banyak kelas pengecualian khusus diperoleh daripada std::runtime_error dan std::logic_error, sebagai contoh: 🎜
  • std::bad_alloc: Peruntukan memori gagal.
  • std::invalid_argument: Parameter tidak sah.
  • std::range_error: Ralat julat (contohnya, subskrip tatasusunan di luar sempadan).
🎜🎜3. Kes praktikal 🎜🎜🎜Pertimbangkan fungsi berikut: 🎜rrreee🎜Apabila denominator ialah 0, fungsi ini membuang std::invalid_argument code >Pengecualian. Pengecualian ini tergolong dalam peringkat <code>std::logic_error dan mewakili ralat parameter tidak sah dalam logik program. 🎜🎜Apabila memanggil fungsi bahagi, anda boleh menggunakan mekanisme pengendalian pengecualian untuk menangkap pengecualian: 🎜rrreee🎜Dalam kes ini, apabila penyebut ialah 0, ia akan menangkap std::invalid_argument membuang pengecualian dan mencetak mesej ralat. 🎜

Atas ialah kandungan terperinci Bagaimana untuk membahagikan hierarki pengecualian dalam pengendalian pengecualian fungsi C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan