上文簡述了在c語言中異常的處理機制,本文主要講解c++中的異常處理.
在c++中,異常的丟擲和處理主要使用了以下三個關鍵字:try、 throw 、 catch.其格式如下:
當我們在程式中想丟擲乙個異常時,可以這樣:
? 1
2
3
4
5
6
7
8
9
#include
#include
using
namespace
std;
int
div(
int
left,
int
right)
return
left/right;
}
當我們想使用這個函式時,需要在函式外部進行異常的捕獲:
? 1
2
3
4
5
6
7
8
9
10
int
main()
catch
(exception & e)
return
0;
}
如果存在不同型別的異常,我們可以這樣:
? 1
2
3
4
5
6
7
8
9
try
catch
(型別名 [形參名])
catch
(型別名 [形參名])
catch
(...)
就上述**來說,我們throw了乙個exception物件,因此在捕獲異常時,最終會匹配到catch到exception的**塊.
當try內的**塊出現異常時,系統會根據catch的順序和引數的匹配程度來選擇執行哪個**塊,因此,系統會選擇最靠前且引數越匹配的**塊.
也就是說,在上述的除法**中,我們throw出的物件在丟擲異常後會還給作業系統,而throw表示式會自己初始化乙個匿名的物件副本,在傳給catch相應的**塊後被**.
當我們的程式丟擲異常時,會先暫停當前函式的執行,開始查詢對應匹配的catch語句.
首先會檢查throw是否在**塊內部.
如果是的話,再去找匹配的catch子句.
如果有匹配的,則進行處理.
如果沒有,則退出當前函式棧,繼續在呼叫函式的棧中進行從查詢.
不斷重複上述過程.
如果到達main函式棧,依舊沒有匹配,則直接終止程式.
上述沿著呼叫鏈查詢匹配的catch子句的過程稱之為棧展開.
找到匹配的catch子句並處理以後,會繼續沿著catch子句後面繼續執行.
異常物件型別與catch說明符的型別必須完全匹配,只有以下幾種情況例外:
1.允許從非const物件到const型別物件的轉換.
2.允許派生型別到基類型別的轉換.
3.將陣列轉換為指向陣列型別的指標,將函式轉換為指向函式的指標.
在函式宣告之後,列出該函式可能丟擲異常型別,並保證該函式不會丟擲其他型別的異常.
1、成員函式在類內宣告和類外定義兩處必須有相同的異常規範.
2、函式丟擲乙個沒有被列在它異常規範中的異常時(且函式中丟擲異常沒有在函式內部進行處理),系統呼叫c++標準庫中定義的函式unexpected().
3、如果異常規範為throw(),則表示不得丟擲任何異常,該函式不用放在try塊中.
4、派生類的虛函式的異常規範必須與基類虛函式的異常規範一樣或更嚴格(是基類虛函式的異常的子集).
(因為派生類的虛函式被指向基類型別的指標呼叫時,保證不會違背基類成員函式的異常規範.)
1. 建構函式完成物件的構造和初始化,需要保證不要在建構函式中丟擲異常,否則可能導致物件不完整或沒有完全初始化.
2. 析構函式主要完成資源的清理,需要保證不要在析構函式內丟擲異常,否則可能導致資源洩漏(記憶體洩漏、控制代碼未關閉等).
自定義異常型別**:
? 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class
exception :
public
exception
public
:
virtual
const
char
* what()
const
private
:
int
_errid;
string _errmsg;
}
測試**:
? 1
2
3
4
5
6
7
8
9
10
void
testexception()
int
main()
catch
(exception &e)
}
關於c++異常處理這一塊的知識暫時先整理到這裡,感謝各位讀者支援!
c 異常處理機制
c 異常處理機制 c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到...
c 異常處理機制
c 異常處理機制是乙個用來有效地處理執行錯誤的非常強大且靈活的工具,它提供了更多的彈性 安全性和穩固性,克服了傳統方法所帶來的問題.異常的丟擲和處理主要使用了以下三個關鍵字 try throw catch 丟擲異常即檢測是否產生異常,在c 中,其採用throw語句來實現,如果檢測到產生異常,則丟擲異...
C 異常處理機制
c 異常處理機制主要使用try,throw,catch三大關鍵字。try catch語句形式如下 require redcarpet markdown redcarpet.new hello world puts markdown.to htmltry catch exception1 ex 捕獲型...