首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 自定義異常類完整指南:從繼承到實戰

     編輯:C++ 入門

異常處理基礎回顧

C++ 異常處理使用 try-catch 結構,可拋出任意類型(int、double、類等)。標準庫提供 std::exception 及其派生類(bad_cast、runtime_error 等),但實際開發中往往需要自定義異常以攜帶更多業務信息。

自定義異常類設計規範

  1. 公開繼承標準異常類:通常繼承 std::logic_error 或 std::runtime_error,它們構造函數接受字符串參數。
  2. 提供虛析構函數:加上 throw()(C++11 後建議 noexcept)承諾不拋出異常,防止析構時觸發 terminate。
  3. 重寫 what() 方法(可選):若需自定義錯誤描述,可覆寫虛函數 what()。

完整代碼示例

#include <iostream>
#include <stdexcept>
#include <string>
using namespace std;

// 自定義異常類
class MyError : public logic_error {
public:
    explicit MyError(const string& msg) : logic_error(msg) {}
    virtual ~MyError() noexcept {} // C++11 使用 noexcept
};

// 業務類
class Sale {
    int x;
public:
    explicit Sale(int val) : x(val) {}
    void check() {
        try {
            if (x > 5) throw MyError("數值超出範圍: " + to_string(x));
            cout << "正常值: " << x << endl;
        } catch (const MyError& e) {
            cerr << "捕獲自定義異常: " << e.what() << endl;
        }
    }
};

int main() {
    Sale s(13);
    s.check();
    return 0;
}

進階要點

  • 異常規範與虛函數:基類虛函數若聲明拋出某異常,派生類覆寫時只能拋出同類或更嚴格的異常,否則違反替換原則。
  • 異常安全性:構造函數中拋出異常時,已構造的成員會正確析構,但對象本身不存在,需注意資源洩漏。
  • 捕獲策略:按引用捕獲(const MyError&)避免切片問題,並能多態調用 what()。

最佳實踐建議

在大型項目中,建議建立異常層次體系(如 AppException 為基類,派生 NetworkError、DBError 等),並在文檔中明確各層拋出的異常類型,便於上層精確捕獲處理。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved