在查詢用來處理被丟擲異常的
catch ()
子句時因為異常而退出, 復合語句和函式定義這個過程被稱作
棧展開stack unwinding 。
隨著棧的展開在退出的復合語句和函式定義中
宣告的區域性變數的生命期也結束了。
c++保證隨著棧的展開儘管區域性類物件的生命期是因為丟擲異常而被結束但是這些區域性類物件的析構函式也會被呼叫。
如果乙個程式沒有為已被丟擲的異常提供
catch
子句該怎麼辦呢?異常不能夠保持在未被處理的狀態異常對於乙個程式非常重要。它表示程式不能夠繼續正常執行,如果沒有找到處理**程式就呼叫
c++標準庫中定義的函式
terminate() ,terminate()
的預設行為是呼叫
abort(),
指示從程式非正常退出, 在大多數情況下呼叫
abort()
已經足夠了。但是在某些特殊情況下我們有必要改變由
terminate()
執行的動作
, 即設定terminater()所觸發的函式處理方法。
異常處理和函式呼叫之間的許多相似之處
throw
表示式的行為有點像函式呼叫, 而
catch
子句有點像函式定義。
這兩種機制的乙個主要區別是: 建立函式呼叫所需要的全部資訊在編譯時刻已經獲得, 而對異常處理機制則不然。
c++異常處理要求執行時刻的支援。 例如對於乙個普通函式呼叫通過函式過載解析過程,編譯器知道在呼叫點上哪個函式會被真正呼叫,但對於異常處理編譯器不知道特定的
throw
表示式的
catch
子句在哪個函式中以及在處理異常之後執行權被轉交到哪兒,這些決策必須在執行時刻進行。 當乙個異常不存在處理**時編譯器無法通知使用者。 這就是為什麼
terminate()
函式存在的原因它是一種執行時刻機制當沒有處理**能夠匹配被丟擲的異常時由它通知使用者
如果函式丟擲了乙個沒有被列在異常規範中的異常會怎麼樣?
程式只有在遇到某種不正常情況時異常才會被丟擲
. 在編譯時刻編譯器不可能知道在執行時程式是否會遇到這些異常
. 因此乙個函式的異常規範的違例只能在執行時刻才能被檢測出來.
如果函式丟擲了乙個沒有被列在其異常規範中的異常
, 則系統呼叫
c++標準庫中定義的函式
unexpected(). unexpected()
的預設行為是呼叫
terminate().
在某些條件下可能有必要改變
unexpected()
執行的動作
. c++
標準庫提供了一種機制可讓我們改變
unexpected()
的預設行為.
空的異常規範保證函式不會丟擲任何異常.
例如函式
no_problem()
保證不會丟擲任何異常
extern void no_problem() throw();
如果乙個函式宣告沒有指定異常規範
, 則該函式可以丟擲任何型別的異常,
在被丟擲的異常型別與異常規範中指定的型別之間不允許型別轉換例. 如
: 此處談到
」test」和
string(「test」)的區別
,記得有本書提到
, string
串除了在定義時用
string(「」)
定義,其他的地方都是
const char*
型別。
int convert( int parm ) throw(string)
在函式convert()
中的throw
表示式丟擲乙個
c 風格的字串
, 由這個
throw
表示式建立
的異常物件的型別為
const char* . 通常
const char*
型的表示式可以被轉換成
string
型別,
但是異常規範不允許從被丟擲的異常型別到異常規範指定的型別之問的轉換
. 如果
convert()
丟擲該異常
, 則呼叫函式
unexpected() .
為了修正這種情況可以如下修改
throw
表示式,
顯式地把表示式的值轉換成
string
型別throw string( "help!" );
後面會談到定義
unexpected()
的動作,
從而進行改變預設的
terminate()
的呼叫。
庫函式與系統呼叫的聯絡與區別
一.概念 系統呼叫 英語 system call 指執行在 使用者空間 的應用程式 向作業系統 核心請求某些服務的呼叫過程。系統呼叫提供了使用者程式與 作業系統 之間的介面。一般來說,系統呼叫都在核心態執行 由於系統呼叫不考慮平台差異性,由核心直接提供,因而移植性較差 幾乎無移植性 庫函式 libr...
庫函式與系統呼叫的聯絡與區別
一.概念 系統呼叫 英語 system call 指執行在 使用者空間 的應用程式 向作業系統 核心請求某些服務的呼叫過程。系統呼叫提供了使用者程式與 作業系統 之間的介面。一般來說,系統呼叫都在核心態執行 由於系統呼叫不考慮平台差異性,由核心直接提供,因而移植性較差 幾乎無移植性 庫函式 libr...
庫函式與系統呼叫的聯絡與區別
一.概念 系統呼叫 英語 system call 指執行在使用者空間的應用程式向作業系統 核心請求某些服務的呼叫過程。系統呼叫提供了使用者程式與作業系統之間的介面。一般來說,系統呼叫都在核心態執行。由於系統呼叫不考慮平台差異性,由核心直接提供,因而移植性較差 幾乎無移植性 庫函式 library f...