程式是從執行某項具體任務開始的。如果執行指定任務的**順利執行,則繼續執行下乙個任務,依此類推,直到程式完成全部功能。現在,如果在執行過程中出現任何錯誤,**將會進入到錯誤處理例程。錯誤處理邏輯與正常的程式邏輯是混合在一起的,並且會交叉執行。雖然這種混合的形式很好,但它會使得**變得難以閱讀、維護和除錯;即使對於規模不是很大的程式,這種情況也依然存在。
請注意,c語言中提供錯誤處理機制還是非常原始的。這是因為c語言本身對其沒有直接的支援。因此,我們在這裡只能採用比較低階的方式–通過函式返回值來判斷。通常來說,如果函式返回負值或null,則表示函式發生了錯誤。有時候,我們會定義乙個名為errno的全域性變數,該變數作為函式呼叫期間的錯誤指示符。標頭檔案error.h則定義了許多具體的錯誤**。
使用異常處理機制,不僅可以提高程式的清晰度,而且能夠利用異常處理和程式邏輯分離的方式來降低**的複雜度。我們可以分別處理它們。這帶來了巨大的靈活性;除此之外,我們可以決定處理哪些異常,並將它們按照相關型別分組處理,或者完全不進行處理。
#ifndef divisionbyzeroexception_h_
#define divisionbyzeroexception_h_
#include
using
namespace
std;
class divisionbyzeroexception :public runtime_error;
};#endif /* divisionbyzeroexception_h_ */
#include
#include "divisionbyzeroexception.h"
using
namespace
std;
double div(int num, int denom)
int main() catch (divisionbyzeroexception &ex)
return
0;}
異常旨在處理同步錯誤,例如陣列的索引越界,除以零,算術溢位,無法分配記憶體等錯誤。異常處理機制無法處理非同步錯誤,例如鍵盤和滑鼠中斷,網路訊息接收,i / o操作等錯誤。這是因為這些事件是並行發生的,與程式控制流無關。
-重新丟擲異常
程式可以決定部分處理異常或者根本不處理異常。在這種情況下,它可以將處理責任傳遞給其他處理程式。
void func1() catch (exception &)
}int main()
catch (exception &)
return
0;}
函式func1是在main程式的try塊內呼叫的。函式func1還包含乙個try … catch塊。 throw語句丟擲乙個標準庫中的異常類例項。catch處理程式(func1)捕獲此異常並再次丟擲它,然後由main中定義的catch塊捕獲。 main中的catch塊對此異常並沒有做任何處理,之後程式便結束了。
我們可以為乙個函式指定乙個可能丟擲的異常列表。
void func1() throw(exception1, exception2,
exception3)
此函式只能丟擲throw列表中指定的異常。如果出現了不屬於throw列表中指定的異常,則異常處理機制將呼叫意外處理函式並終止該程式的執行。然而,如果我們不提供throw列表,它會自動呼叫意外處理函式。(我們可以使用set_unexpected函式來自定義意外處理函式的具體行為。有關此內容的更多資訊,請參閱c ++標準文件)。
void func1() throw()
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 捕獲型...