第十四章 異常處理(1 / 3)

同時,上述代碼用exit函數退出程序[其中exit(0)表示正常退出,而exit(1)表示異常退出]。這種處理方法對小型程序來說是可以接受的,即當異常發生時,立即中斷程序釋放資源。但對於大中型程序而言,這種處理方法過於簡單,因為在大中型程序,函數之間有著明確的分工和複雜的調用關係。如果簡單地在發現異常的函數中處理異常,就沒有機會對已完成的工作做妥善的處理。因此,希望應用這些代碼的程序按照自己的意思處理異常,可是這些程序卻無法檢測異常。相反,能檢測異常的代碼卻無法確定應用它的程序如何處理這些異常。

C++的異常處理機製較好地解決了傳統異常處理存在的問題。其基本思想就是捕獲異常之後再處理異常。其目的就是在異常發生時,盡可能地減小破壞,周密地善後,而不去影響其他部分程序的運行。這對大中型程序是非常必要的。

14.3異常處理的實現

C++的異常處理機製是通過try、catch和throw3個關鍵字實現的,稱作try–catch–throw結構,try–catch–throw結構的一般使用形式如下。

說明:(1)try語句塊。

關鍵字try標誌程序中異常語句塊的開始是異常檢測部分,將可能產生錯誤的語句包含在try語句塊中。關鍵字try後必須緊跟一對大括號。

(2)catch語句塊。

關鍵字catch標誌程序中捕獲異常語句塊的開始是異常捕獲和處理部分。

catch語句塊要緊跟try語句塊之後,可以有一個catch語句塊,也可以有多個catch語句塊。每個catch語句塊後的一對小括號裏麵是異常類型聲明部分,其指明了catch語句塊所處理的異常類型,它與函數的形式參數類似,隻不過隻能聲明一個形式參數,因此,每個catch語句塊隻能捕獲並處理一種異常。當類型參數的數據類型與拋出異常的數據類型匹配時,稱catch語句塊捕獲了一個異常。一對小括號後麵緊跟的一對大括號是異常處理部分。

(3)throw語句。

關鍵字throw用於拋出異常,其後跟表達式,與return語句類似。

表達式可以是任何類型,包括常量。表達式的類型稱為異常類型,throw語句拋出的異常信息就是通過異常類型進行區別的。如果需要處理多處異常,就應該使用不同類型的表達式,可以是係統提供的基本類型,也可以是用戶自定義的類型。

例如,使用try–catch-throw結構對指定文件打不開時進行異常處理:在使用try–catch-throw結構時,需要把可能發生異常的部分放在try語句塊的大括號中。由於打不開文件就拋出一個字符串類型的異常,因此,需要把這部分代碼放在try語句塊的大括號中。為了能夠捕獲並處理由於打不開文件所產生的字符串類型異常,需要在try語句塊後麵跟有類型參數是字符串類型的catch語句塊。也就是說,catch語句塊隻能捕獲和catch語句塊的類型參數匹配的異常。並且當異常被捕獲時,catch語句塊內的代碼將被運行,也就是處理該異常。此處,處理異常的方式也是簡單的退出程序。

同時,上述代碼用exit函數退出程序[其中exit(0)表示正常退出,而exit(1)表示異常退出]。這種處理方法對小型程序來說是可以接受的,即當異常發生時,立即中斷程序釋放資源。但對於大中型程序而言,這種處理方法過於簡單,因為在大中型程序,函數之間有著明確的分工和複雜的調用關係。如果簡單地在發現異常的函數中處理異常,就沒有機會對已完成的工作做妥善的處理。因此,希望應用這些代碼的程序按照自己的意思處理異常,可是這些程序卻無法檢測異常。相反,能檢測異常的代碼卻無法確定應用它的程序如何處理這些異常。

C++的異常處理機製較好地解決了傳統異常處理存在的問題。其基本思想就是捕獲異常之後再處理異常。其目的就是在異常發生時,盡可能地減小破壞,周密地善後,而不去影響其他部分程序的運行。這對大中型程序是非常必要的。

14.3異常處理的實現

C++的異常處理機製是通過try、catch和throw3個關鍵字實現的,稱作try–catch–throw結構,try–catch–throw結構的一般使用形式如下。