再探C++Primer(8)try語句塊和異常處理

###try語句塊#c++

異常處理部分使用try語句塊來處理異常。try語句塊以try關鍵字開始,以一個或多個catch子句結束。try語句塊中,使用throw拋出的異常被catch捕獲並處理。windows

其語法規則爲:數組

try{
	program-statements
}catch(exception-declaration){
	handler-statements		
}catch(exception-declaration){
	handler-statements
}	//..

其中try語句塊中的program-statements爲正常語句塊,exception-declaration爲異常聲明,handler-statements爲捕獲到異常後的異常處理語句。dom

###throw和catch#函數

C++裏異常有兩種操作系統

  • 一種是CPU發起的(好比非法內存訪問等),強行中斷當前執行的程序,並由運行環境執行適當的應對代碼。 可是在windows環境下,如vc++中,底層直接是用的Win32異常來實現的,因此從操做系統上來看,全是Win32異常,並不會被c++的try/catch捕獲。指針

  • 一種是C++裏用throw語句拋出的異常,這個的結果只是一個單純的跳轉。code

  • VC++若是編譯的時候加/EHa參數 發生第一種異常的時候能夠用C++的try/catch捕捉。對象

咱們使用throw來拋出異常,用catch來捕獲異常,以下舉例:繼承

double a,b;
while (cin<<a<<b){
	try{
		if (b != 0){
			a=a/b;
			cout<<a<<endl;
		}else{
			throw runtime_error("被0除");
		}
	}catch(runtime_error err){
		cout<<err.what()<<"\nTry again?(y or n)"<<endl;
		char c;
		cin<<c;
		if (!cin || c == 'n')
			break;
	}
}
  • **棧展開:**若是拋出的異常的函數調用語句位於一個try,則檢查與該try關聯的catch子句,若是找到了匹配的catch,就使用該catch來處理異常,不然若是該try包含在其餘try塊中,則繼續檢查與外層try匹配的catch子句,若是仍沒有,則退出當前主調函數,繼續在調用了該函數的其餘函數中尋找,以此類推。若是最終沒有catch匹配,則調用標準庫函數terminate退出該程序;

  • **棧展開過程當中對象被自動銷燬:**塊內局部對象會自動銷燬,類類型對象會調用其析構函數;

  • **catch匹配類型:**容許throw很是量,catch捕獲爲常量;容許throw派生類,catch捕獲爲基類;數組被轉換爲指向數組(元素)類型的指針,函數被轉換成直線該函數類型的指針;包括標準算數類型轉換和類類型轉換在內,其餘全部轉換規則都不能在匹配catch時使用;

  • **從新拋出:**當一個catch不能完整處理某個異常,能夠將其從新拋出傳遞給另外一個catch語句,從新拋出還是一個throw語句,可是不包括任何表達式:throw;

  • **catch(...):**當使用catch來捕捉異常時,能夠用catch(...)來捕獲全部的異常。能夠單獨出現,也能夠和其餘的catch語句出現,若是catch(...)和其餘的一塊兒出現,則必須位於最後。

###C++中定義了一些標準異常:#

exception				//最多見的問題
runtime_error			//只有在運行時才能檢測出的問題
range_error				//運行時錯誤:生成計算結果超出了有意義的值域範圍
overflow_error			//運行時錯誤:計算上溢
underflow_error			//運行時錯誤:計算下溢
logic_error				//程序邏輯錯誤
domain_error			//邏輯錯誤:參數對應的結果值不存在
invalid_argument		//邏輯錯誤:無效參數
length_error			//邏輯錯誤:試圖建立一個超出該類型最大長度的對象
out_of_range			//邏輯錯誤:使用一個超出有效範圍的值
  • exception是C++標準庫異常類繼承層次中的基類,定義於exception頭文件,咱們自定義的異常類也要繼承自exception,它只報告異常的產生,不提供任何額外信息;
  • 運行時錯誤由程序以外的事件形成,只有在運行時才能檢測到;
  • 邏輯類錯誤是程序自己不正常時形成,例如無效實參或超出範圍的實參。
  • 運行時錯誤和邏輯類錯誤定義於stdexcept頭文件;

此外還有

  • new頭文件中定義的bad_alloc類型,用於報告new操做符不能正確分配內存的情形;
  • type_info頭文件中定義的bad_cast異常類型,dynamic_cast失敗時,程序會拋出bad_cast異常類.
相關文章
相關標籤/搜索