1. 程式人生 > >C++ 異常處理

C++ 異常處理

main 嘗試 bsp 拋出異常 c_str out 產生 space virt

C++ 異常處理

異常是程序在執行期間產生的問題。C++ 異常是指在程序運行時發生的特殊情況,比如嘗試除以零的操作。

異常提供了一種轉移程序控制權的方式。C++ 異常處理涉及到三個關鍵字:try、catch、throw

  • throw: 當問題出現時,程序會拋出一個異常。這是通過使用 throw 關鍵字來完成的。
  • catch: 在您想要處理問題的地方,通過異常處理程序捕獲異常。catch 關鍵字用於捕獲異常。
  • try: try 塊中的代碼標識將被激活的特定異常。它後面通常跟著一個或多個 catch 塊。

如果有一個塊拋出一個異常,捕獲異常的方法會使用 trycatch 關鍵字。try 塊中放置可能拋出異常的代碼,try 塊中的代碼被稱為保護代碼。

const throw() 不是函數,這個東西叫異常規格說明,表示 what 函數可以拋出異常的類型,類型說明放到 () 裏,這裏面沒有類型,就是聲明這個函數不拋出異常,通常函數不寫後面的就表示函數可以拋出任何類型的異常。

class MyException :public exception
{

    public:
        const char* what() const throw(){
             return "my exception";
        }

};

異常規格說明

1、異常規格說明的目的是為了讓函數使用者知道該函數可能拋出的異常有哪些。
可以在函數的聲明中列出這個函數可能拋擲的所有異常類型。例如:

void fun() throw(A,B,C,D);

2、若無異常接口聲明,則此函數可以拋擲任何類型的異常。

3、不拋擲任何類型異常的函數聲明如下:

#include <iostream>
#include <exception>
using namespace std;

class MyException
{
public:
    MyException(const char *message)
        : message_(message)
    {
        cout << "MyException ..." << endl;
    }
    MyException(
const MyException &other) : message_(other.message_) { cout << "Copy MyException ..." << endl; } virtual ~MyException() { cout << "~MyException ..." << endl; } const char *what() const { return message_.c_str(); } private: string message_; }; class MyExceptionD : public MyException { public: MyExceptionD(const char *message) : MyException(message) { cout << "MyExceptionD ..." << endl; } MyExceptionD(const MyExceptionD &other) : MyException(other) { cout << "Copy MyExceptionD ..." << endl; } ~MyExceptionD() { cout << "~MyExceptionD ..." << endl; } }; void fun(int n) throw (int, MyException, MyExceptionD) { if (n == 1) { throw 1; } else if (n == 2) { throw MyException("test Exception"); } else if (n == 3) { throw MyExceptionD("test ExceptionD"); } } void fun2() throw() { } int main(void) { try { fun(2); } catch (int n) { cout << "catch int ..." << endl; cout << "n=" << n << endl; } catch (MyExceptionD &e) { cout << "catch MyExceptionD ..." << endl; cout << e.what() << endl; } catch (MyException &e) { cout << "catch MyException ..." << endl; cout << e.what() << endl; } return 0; }

C++ 異常處理