學習C 異常處理

2021-10-02 20:10:47 字數 2964 閱讀 8440

異常可能是外部因素導致的,如系統沒有足夠的記憶體;也可能是應用程式內部因素導致的,如使用的指標包含無效值或除數為零。為向呼叫者指出錯誤,有些模組引發異常。

異常會打斷應用程式的正常流程。畢竟,如果沒有記憶體可用,應用程式就無法完成分配給它的任務。然而應用程式可處理這種異常:向使用者顯示一條友好的錯誤訊息,採取必要的挽救措施並妥善地退出。

要捕獲語句可能引發的異常,可將它們放在try塊中,並使用catch塊對try塊可能引發的異常進行處理,語法如下:

void

func()

catch(.

..)}

(1)使用catch(…)處理所有異常

成功分配記憶體時,預設形式的new返回乙個指向該記憶體單元的有效指標,但失敗時引發異常。下面將演示如何捕獲使用new分配記憶體時可能引發的異常,並在計算機不能分配請求的記憶體時進行處理。

#include

using

namespace std;

intmain()

catch(.

..)//...捕獲所有型別的異常

return0;

}

在此程式中,如果鍵盤輸入的input為乙個負數,這顯然不符合要求。如果沒有異常處理,該程式將以討厭你的方式終止。但由於有異常處理程式,程式將顯示一條友好的訊息:got to end, sorry!結束程式。

(2)捕獲特定型別的異常

一般的異常的型別是已知的,為了查明導致異常的原因,執行更有針對性的清理工作,或者至少是向使用者顯示一條提示訊息,這時就可以選擇捕獲這種型別的異常。

其實上面(1)中的程式,當鍵盤輸入指定儲存的個數為負數時,將導致引發異常,而該異常型別為std::bad_alloc。

下面程式將演示捕獲std::bad_alloc型別的異常:

#include

#include

using

namespace std;

intmain()

catch

(std::bad_alloc& exp)

//捕獲型別為bad_alloc的異常,這種異常由new引發

catch(.

..)//獲未被其他catch塊顯示捕獲的所有異常

return0;

}

在上面演示的程式中,捕獲std::bad_alloc時,實際上是捕獲new引發的std::bad_alloc類物件。你也可以引發自己選擇的異常,為此只需要使用關鍵字throw。語法如下:

void func()

當做除法運算時,若除數為0將導致程式異常。下面將演示如何使用throw引發這種自定義異常:

#include

using

namespace std;

double

divide

(double dividend,

double divisor)

intmain()

catch

(const

char

* exp)

//捕獲型別為char*的異常,於是可呼叫函式divide()中可能引發的異常throw

return0;

}

注意:上述**沒有將整個main()都放在try{}中,而只在其中包含可能引發異常的**。提倡這種做法,因為異常處理也可能降低**的執行效能。

捕獲std::bad_alllocl型別異常時,實際上是捕獲new引發的std::bad_alloc物件。std::bad_alloc繼承了c++標準類std::exception,而使用exception類時,需要新增標頭檔案:#include

從std::exception派生出來的幾個重要的異常類:

bad_alloc: 使用new請求記憶體失敗時引發

bad_cast: 試圖使用dynamic_cast轉換錯誤型別時引發

ios_base::failure: 由iostream庫中的函式和方法引發

std::exception是異常基類,定義了虛函式what(),用來描述導致異常的原因。

因為std::exception是眾多異常型別的基類,所以所有將std::exception作為基類的異常,均可使用catch(const exception&)捕獲:

void

func()

catch

(const std::exception& exp)

}

從std::exception派生出自定義異常類

讓自定義異常繼承std::exception的好處在於,現有的異常處理程式catch(const std::exception)不但能捕獲bad_alloc、bad_cast等異常,還能捕獲自定義異常,因為它們的基類都是exception。

下面將演示繼承std::exception的customexception類:

#include

#include

#include

using

namespace std;

class

customexception

:public std::exception

virtual

const

char

*what()

const

throw()

};double

divide

(double dividend,

double divisor)

intmain()

catch

(exception& exp)

//不但處理異常customexception,還處理bad_alloc等其他以exception為基類的異常

return0;

}

c的異常處理學習

如題,源於對博主bigloomy的學習 先看 include include jmp buf buf void error code void int main else printf 出現錯誤除數為0 n 發現 執行流被改變了,真是神奇 看看維基百科怎麼解釋的 setjmp.h 是c標準函式庫 中...

c 學習筆記14,異常處理

異常是程式在執行期間產生的問題。c 異常是指在程式執行時發生的特殊情況,比如嘗試除以零的操作。異常提供了一種轉移程式控制權的方式。c 異常處理涉及到三個關鍵字 try catch throw。throw 當問題出現時,程式會丟擲乙個異常。這是通過使用 throw 關鍵字來完成的。catch 在您想要...

C 學習筆記之 異常處理

try catch finally try語句用來知名為避免出現異常而被保護的 段,並在發生異常時提供 處理異常。try語句由三部分組成 try 包含為避免出現異常而被保護的 catch 若try發生異常,則catch子句處理異常。特定catch子句允許多於乙個。finally 若在try子句中沒有...