C++之異常處理

來源:互聯網
上載者:User

  程式中的錯誤分為編譯時間的錯誤和運行時的錯誤。編譯時間的錯誤主要是語法錯誤,比如:句尾沒有加分號,括弧不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統會指出錯誤在第幾行,什麼錯誤。而運行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如記憶體空間不夠,或者在調用函數時,出現數組越界等錯誤。如果對於這些錯誤沒有採取有效防範措施,那麼往往會得不到正確的運行結果,程式不正常終止或嚴重的會出現死機現象。我們把程式運行時的錯誤統稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機制結構清晰,在一定程度上可以保證程式的健壯性。

  C++中處理異常的過程是這樣的:在執行程式發生異常,可以不在本函數中處理,而是拋出一個錯誤資訊,把它傳遞給上一級的函數來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,運行系統會自動調用系統函數terminate,由它調用abort終止程式。這樣的異常處理方法使得異常引發和處理機制分離,而不在同一個函數中處理。這使得底層函數只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處理的任務交給上一層函數去處理。

  C++的異常處理機制有3部分組成:try(檢查),throw(拋出),catch(捕獲)。把需要檢查的語句放在try模組中,檢查語句發生錯誤,throw拋出異常,發出錯誤資訊,由catch來捕獲異常資訊,並加以處理。一般throw拋出的異常要和catch所捕獲的異常類型所匹配。異常處理的一般格式為:

  try

  {

    被檢查語句

    throw 異常

  }

  catch(異常類型1)

  {

    進行異常處理的語句1

  }

  catch(異常類型2)

  {

    進行異常處理的語句2

  }

  ...

下面我們用樣本示範一下異常處理:

 1 #include "stdafx.h"
2 #include <iostream>
3
4 template <typename T>
5 T Div(T x,T y)
6 {
7 if(y==0)
8 throw y;//拋出異常
9 return x/y;
10 }
11
12 int main()
13 {
14 int x=5,y=0;
15 double x1=5.5,y1=0.0;
16 try
17 {
18 //被檢查的語句
19 std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
20 std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
21 }
22 catch(int)//異常類型
23 {
24 std::cout<<"除數為0,計算錯誤!"<<std::endl;//異常處理語句
25 }
26 catch(double)//異常類型
27 {
28 std::cout<<"除數為0.0,計算錯誤!"<<std::endl;//異常處理語句
29 }
30
31 return0;
32 }

結果:

看了上述的範例程式碼,也許有人會問,第二個雙精確度類型的除法計算也應該拋出異常才對啊,在實際的運行過程中並非如此,其實該雙精確度類型除法函數根本沒有被執行過。以上程式的執行規程為:調用函數Div(x,y)時發生異常,由函數Div中的語句"throw y"拋出異常,並不在往下執行return x/y,接著catch捕獲int類型的異常並處理異常,最後直接執行"return 0"。因此函數Div(x1,y1)和catch(double){}模組根本沒有被執行。如果,我們把y的值改為1,則結果就變成為:

如果在執行try語句模組時,沒有發生異常,則catch語句塊不起作用,流程轉到其後的語句繼續執行。從上述兩個結果中可知第一次throw拋出的int類型所以找到處理該類型的catch,而第二次是拋出double類型所找到的是處理double類型的catch。

  下面對異常處理補充幾點:(1)try和catch塊中必須要用花括弧括起來,即使花括弧內只有一個語句也不能省略花括弧;(2)try和catch必須成對出現,一個try_catch結果中只能有一個try塊,但可以有多個catch塊,以便與不同的異常資訊匹配;(3)如果在catch塊中沒有指定異常資訊的類型,而用刪節號"...",則表示它可以捕獲任何類型的異常資訊;(4)如果throw不包括任何錶達式,表示它把當前正在處理的異常資訊再次拋出,傳給其上一層的catch來處理;(5)C++中一旦拋出一個異常,如果程式沒有任何的捕獲,那麼系統將會自動調用一個系統函數terminate,由它調用abort終止程式;

  最後還是一樣,我將用一個樣本來總結一下今天所講的內容(開發工具:vs2010): 

View Code

 1 #include "stdafx.h"
2 #include <iostream>
3
4 template <typename T>
5 T Div(T x,T y)
6 {
7 if(y==0)
8 throw y;//拋出異常
9 return x/y;
10 }
11
12 int main()
13 {
14 int x=5,y=1;
15 double x1=5.5,y1=0.0;
16 try
17 {
18 //被檢查的語句
19 std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
20 std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
21 }
22 catch(...)//捕獲任意類型異常
23 {
24 try
25 {
26 std::cout<<"任意類型異常!"<<std::endl;
27 throw;//拋出當前處理異常資訊給上一層catch
28 }
29 catch(int)//異常類型
30 {
31 std::cout<<"除數為0,計算錯誤!"<<std::endl;//異常處理語句
32 }
33 catch(double)//異常類型
34 {
35 std::cout<<"除數為0.0,計算錯誤!"<<std::endl;//異常處理語句
36 }
37
38 }
39
40 return0;
41 }

結果:

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.