C 中的異常例項詳解

2022-10-08 15:54:08 字數 2763 閱讀 8358

目錄

異常: 異常是物件導向與法處理錯誤的一種方式

//第2點

t& operator(int index)

trycatch(exceptiontype e1)

catch(exceptiontype e2)

catch(exceptiontype en)

2.2.1 異常的丟擲和匹配原則

· 原則2:函式呼叫鏈中的異常 - 棧展開的匹配原則

棧展開:上述的這個沿著呼叫鏈去逐個棧中查詢匹配的catch語句的過程就是棧展開。

//**演示:f3()中丟擲異常,該異常會被f1()捕捉,而在main函式中的catch是無法捕捉到的

void f3()

void f2()

void f1()

catch(int& err)

}int main()

catch(int& err)

return 0;

}注意:

丟擲異常物件後,會生成乙個異常物件的拷貝(可能是乙個臨時物件),這個拷貝的臨時物件在被catch後會被銷毀。異常的執行流執行順序:從throw丟擲異常處跳轉到呼叫鏈中能夠匹配的catch語句中;然後執行catch塊中的**;catch執行完畢後在當前函式棧中順序執行。(整個呼叫鏈中沒有匹配的就終止程式)

可能會存在單個catch不能完全處理乙個異常的情況,在經過一些校正處理後,我們希望將該異常交給外層呼叫鏈中的函式來處理,此時我們可以通過在catch中重新丟擲異常的方式把異常傳遞給呼叫鏈的上層函式處理。

//在secondthro函式中我們要delete動態開闢(new出來)的空間,

//如果不使用異常的重新丟擲的話,就會造成記憶體洩漏問題 (也可以使用raii)

void firstthrowexception()

void secondthrowexception()

catch(...)

}void soluteexception()

catch(const char* err)

}int main()

自定義異常體系實際上就是自己定義的一套異常管理體系,很多公司當中都會自定義自己的異常體系以便於規範的進行異常管理。它主要用到了我們在上面所說的一條規則: 我們只需要丟擲派生類物件,然後捕獲基類物件就可以了。這樣的丟擲與捕獲方式非常便於異常的處理。

class myexception

virtual string what() const = 0; //必須放到public下才能讓類外定義的成員訪問到

protected:

int _id; //錯誤碼

string _errmsg; //存放錯誤資訊

//list _tracestack; //存放呼叫鏈的資訊

//...

};class cacheexception : public myexception

virtual string what() const };

class networkexception : public myexception

virtual string what() const };

class sqlexception : public myexception

virtual string what() const };

int main()

catch (const myexception& e) //只需要捕獲基類物件

catch (...) //走到這裡說明出現未知異常

return 0;

}異常規範的指定是為了讓使用者知道函式可能丟擲哪些異www.cppcns.com常,用法:

void func1() throw(); //表示該函式不會拋異常

void func2() noexcept; //等價於throw() 表示該函式不會拋異常

void func3() throw(std::bad_alloc); //表示該函式只會丟擲bad_alloc的異常

void func4() throw(int, double, string); //表示該函式會丟擲int/djkjmyyouble/string型別中的某種異常

c++提供了一系列標準的異常,定義在中,下面是這些異常的組織形式。

異常描述std::exception該異常是所有標準 c++ 異常的父類。std::bad_alloc該異常可以通過 new 丟擲。std::bad_cast該異常可以通過 dynamic_cast 丟擲。std::bad_exception這在處理 c++ 程式中無法預期的異常時非常有用。std::bad_typeid該異常可以通過 typeid 丟擲。std::logic_error理論上可以通過讀取**來檢測到的異常。std::domain_error當使用了乙個無效的數學域時,會丟擲該異常。std::invalid_argument當使用了無效的引數時,會丟擲該異常。std::length_error當建立了太長的 std::string 時,會丟擲該異常。std::out_of_range該異常可以通過方法丟擲,例如 std::vector 和 std::bitset<>::operator。std::runtime_error理論上不可以通過讀取**來檢測到的異常。std::overflow_error當發生數學上溢時,會丟擲該異常。std::range_error當嘗試儲存超出範圍的值時,會丟擲該異常。std::underflow_error當發生數學下溢時,會丟擲該異常。

int main()

catch(const exception& e)

catch(...)

}2.8.1 優點

2.8.2 缺點

php中try catch捕獲異常例項詳解

php中try catch 語句概述 php5新增了類似於其它語言的異常處理模組。在 php 中所產生的異常可被 throw語句丟擲並被 catch 語句捕獲。注 一定要先拋才能獲取 需要進行異常處理的 都必須放入 try 塊內,以便捕獲可能存在的異常。每乙個 try 至少要有乙個與之對應的 cat...

C 中的EventHandler例項詳解

具體詳情如下所示 這裡定義了乙個水箱類 publicclass水箱 這是水箱的屬性 publicdouble體積 這是水箱空的事件 publiceventeventhandler 水箱空 這裡定義了乙個加水器類 publicclass加水器 publicclassuser private加水器 加水...

C 中的EventHandler例項詳解

廢話不多說了,具體詳情如下所示 這裡定義了乙個水箱類 public class 水箱 這是水箱的屬性 public double 體積 這是水箱空的事件 public event eventhandler 水箱空 這裡定義了乙個加水器類 public class 加水器 public class u...