6.4 異常處理
程式中常見的錯誤分為兩大類:編譯時期的錯誤和執行時期的錯誤。
編譯時期的錯誤比較簡單容易發現:主要是語法錯誤,如關鍵字拼寫錯誤、缺分號、括號不匹配等
執行時期的錯誤比較難發現,甚至是不可預料的:如演算法出錯、記憶體空間不足、角標越界、檔案無法開啟等
處理異常有兩種方式:傳統的異常處理方法、系統異常處理機制。
傳統異常處理方法特點:是採用判斷和分支語句類實現,適合滿足小型的應用程式。
系統異常處理機制特點:通過檢測、丟擲並捕獲異常來實現,適合各種大型應用程式
//例6.10 傳統的異常處理方法舉例
#includeusingnamespace
std;
inline
int div(int x,int
y);int
main()
inline
int div(int x,inty)
return x/y;
}
6.4.2 異常處理的方法
c++處理異常的辦法是:如果在執行乙個函式過程中出現異常,可以不在本函式中立即處理,而是發出乙個資訊,傳給它的上一級(即呼叫函式)來解決,如果上一級也不能處理,就再傳其上一級,由上一級處理,如此逐級上傳,如果到最高一級還無法處理,執行系統一般會自動呼叫系統函式terminate,由它呼叫abort終止程式。
這樣的處理方法使得異常的引發和處理機制分離,而不是有同乙個函式完成。這樣的做法的好處是使底層函式(被呼叫函式)著重用於解決實際任務,而不必過多的考慮對異常的處理,以減輕底層函式的負擔,而把處理異常的任務移到上層去處理。
c++處理異常的機制是由檢查、丟擲和捕獲3個部分組成,分別由3中語句來完成;try(檢查)、
throw(丟擲)、catch(捕獲)
1.異常的丟擲
丟擲異常使用throw語句,其格式如下:
throw 表示式;
如果在某段程式中發現了異常,就可以使用throw語句來丟擲異常給呼叫者,該異常由與之匹配的catch語句來捕獲。throw語句中的"表示式」是可以丟擲的異常型別,異常型別由表示式的型別來表示。例如上例中的異常處理:
inline int div(int x,inty)
由於變數y的型別是int型,所以當除數為0時語句throw將丟擲int型異常
2.異常的檢查與捕獲
異常的檢查try語句與捕獲catch語句的格式如下:
trycatch(異常型別宣告 1
)
catch(異常型別宣告 2
)
......
catch
(異常型別宣告 n)
例如上述例子的異常檢查與捕獲:
try//檢查異常
catch(int) //
捕獲異常,異常型別為int型別
//例6.11 處理除數為0異常的程式。
#includeusingnamespace
std;
inline
int div(int x,int
y);int
main()
catch(int
i)
return0;
} inline
int div(int x,int
y)
程式執行結果是:
7/3=2
除數為0,錯誤!
over
在本例中,進行異常處理的方法如下:
(1)首先將需要檢查,也是容易引起異常的語句或程式段放在try塊的花括號中。
(2)如果在執行try語句塊內的復合語句過程中沒有發生異常,則catch子句不起作用,
繼續轉到catch子句後面的語句繼續進行。
(3)如果在執行try塊內的復合語句(或被呼叫函式)過程中發生異常,則throw語句丟擲乙個異常資訊。
(4)throw丟擲的異常資訊傳到try_catch結構,系統尋找與之匹配的catch子句。
(5)執行異常處理語句後,程式繼續執行catch子句後的語句。
說明:(1)被檢測的語句或程式段必須放在try塊中,否則不起作用。
(2)try和catch塊中必須有用花括號括起來的復合語句,即使花括號內只有乙個語句也不能省略花括號。
(3)乙個try_catch結構中只能有乙個try塊,但卻可以有多個catch塊,以便與不同的異常資訊匹配。
catch後面的括號中,一般只寫異常資訊的型別名。
(4)如果在catch語句中沒有指定異常資訊的型別,而是採用了三點刪節點"...",則表示它可以捕獲任何
型別的異常資訊。
(5)在某種情況下,在throw語句中可以不包括表示式,如;
throw;
此時它將當前正在處理的異常資訊再次丟擲,給起上一層的catch塊處理。
(6)c++中,一旦丟擲乙個異常,而程式又不捕獲的話,那麼系統就呼叫系統函
數terminate,由它呼叫abort終止程式。
//例6.12 有多個catch塊的異常處理程式。
#includeusingnamespace
std;
intmain()
catch(int)
catch(double)
cout
<<"
end"
}/*程式執行結果是:
異常發生!雙精度型!
end
*/
//例 6.13 有刪節點的異常處理程式。
#includeusingnamespace
std;
void func(intx)
intmain()
catch
(...)
cout
<<"
end"
}/*程式執行結果是:
異常發生!任意型別!
end*/
的異常處理 C 異常處理總結
做開發不僅僅要考慮到業務邏輯更要在寫 時將各種可能考慮周全,但是這又是很難的事情,畢竟開發就是個人的事,而使用者可能上萬甚至百萬級別。這時,程式的穩定性就極為重要,我們不能讓程式因為某一處執行出問題而就直接導致程式或者產生其他更嚴重的後果,比如 做除法時當除數為零時,陣列訪問越界時,容器capaci...
異常處理(二 C語言的異常處理)
1 異常終止 標準c庫提供了abort 和exit 兩個函式,它們可以強行終止程式的執行,其宣告處於 標頭檔案中。這兩個函式本身不能檢測異常,但在c程式發生異常後經常使用這兩個函式進行程式終止。下面的這個例子描述了exit 的行為 code include include int main void...
C 的異常處理
c 的異常處理用到 try catch try塊是乙個普通的程式塊,就一般運 況而言跟沒有tryd的情況是一樣的,但在異常出現時,往往把可能出現異常的一些語句,包括函式的呼叫,比如在資料庫程式設計程式設計中,一些管理資訊系統在連線資料庫的時候 特別是ado方式 往往會把資料庫的連線與表的開啟語句放在...