HOWTO · C++

C++ 中的自定義異常

關於在 C++ 中實現自定義異常類的程式設計教程。

這個簡短的程式設計教程是關於在 C++ 中實現自定義異常類和在 C++ 中實現使用者定義的異常類的基本規則。

C++ 中的異常處理

在 C++ 中,異常處理是一種處理執行時問題的方法。我們處理異常,因此即使發生執行時問題,也可以維持應用程式的正常流程。

在 C++ 中,異常是在執行過程中丟擲的一個物件,會干擾程式的正常執行。

std::exception 類是所有異常的根源。如果我們不處理任何異常,應用程式將列印一條錯誤訊息並終止。

異常允許控制從一個程式區域傳遞到另一個程式區域。三個關鍵字 trycatchthrow 處理 C++ 中的異常。

  1. throw - 如果你的程式碼中的某個段可能導致問題,那麼我們使用 throw 關鍵字丟擲異常並指定可能發生的異常型別。
  2. try - 它包含可能導致錯誤並需要丟擲異常的程式碼段。
  3. catch - 丟擲異常時呼叫的塊。在這段程式碼中,我們可以通知使用者錯誤並在需要時以程式設計方式結束程式。

一個常見的異常示例是執行時發生的除以零錯誤。它是程式中最常發生的異常。

讓我們看一下下面的程式碼片段,它很容易出現這種除以零執行時異常。

#include <iostream>
using namespace std;
float divideFunc(int a, int b) {
  if (b == 0) {
    throw "User made a division with zero!";
  }
  return (a / b);
}
int main() {
  int num1 = 20;
  int num2 = 0;
  float result = 0;
  try {
    result = divideFunc(num1, num2);
    cout << result << endl;
  } catch (const char* msg) {
    cout << msg << endl;
  }
}

輸出:

除以零執行時異常

異常類層次結構

exception 是一個有許多類作為子類的類,所有這些類都是異常的型別。C++ 有一組預定義的常見異常型別,可以在程式中輕鬆使用。

異常類層次結構

C++ 中的自定義異常

C++ 中未指定的自定義異常可能有助於在特定情況下生成。在 C++ 中,任何滿足特定條件的型別都可以被捕獲或丟擲。

這些包括具有有效複製建構函式和解構函式的型別。

自定義異常為異常處理機制提供了有關問題的有用資訊。它們可以通過建立具有必要屬性的新類並丟擲該類的例項或通過從 std::exception 繼承並覆蓋 what() 函式來建立。

假設我們需要在程式中獲取正數輸入。如果輸入負數,我們可以丟擲異常。

我們可以如下建立一個自定義異常類。

class MyExceptionClass : public exception {
 public:
  const char* what() const throw() { return "Negative number not allowed\n"; }
};

這可以在驅動程式中捕獲,如下所示。

int main() {
  try {
    int a;
    cout << "Enter a number : \n";
    cin >> a;
    if (a < 0) {
      MyExceptionClass c;
      throw c;
    } else {
      cout << "you entered: " << a << endl;
    }
  } catch (exception& e) {
    cout << e.what();
  }
}

輸出:

異常輸出

我們可以在上面的程式碼中看到,我們已經使用 Exception 類繼承了我們的自定義異常類,並覆蓋了一個將在丟擲異常時呼叫的方法 what()