初探C 異常處理

2021-05-22 00:17:28 字數 3088 閱讀 7610

一、基礎

在c# 裡,異常處理就是c# 為處理錯誤情況提供的一種機制。它為每種錯誤情況提供了定製的處理方式,並且把標識錯誤的**與處理錯誤的**分離開來。

在**中對異常進行處理,一般要使用三個**塊:

二、異常處理

不管程式寫得再好,異常都可能會發生,而程式也必須能夠處理可能出現的錯誤。所以我們要站在異常一定可能會發生的角度來編寫異常處理程式,應對程式有可能發生的錯誤建立乙個良好的異常處理策略。

異常產生的時候,我們想知道的是什麼原因造成的錯誤以及錯誤的相關資訊。我們可以根據實際情況丟擲具體型別的異常,方便捕捉到異常時做出具體的處理。在編寫**過程中,可以使用系統已定義的相關異常類以及自定義的異常類來例項化並丟擲我們需要的異常。如乙個不可能實現的介面,我們可以丟擲「system.notsupportedexceptiion」的異常來告訴介面的呼叫者。

在處理異常的時候,我們應該將可處理的具體異常分別在catch 塊中做出相應處理,否則程式將終止執行。針對每一種異常,以不同方式處理,避免對所有異常做出一樣的處理。並且在異常產生時,給使用者乙個友好的提示(普通使用者對異常的具體內容是不明白的,這就需要我們給出相關的簡要資訊和解決方案,或則告之聯絡管理員等。),並在可能的情況下給使用者提供可能的選擇(終止,重試,忽略),讓使用者來決定程式的執行方向。同時,要將異常做日誌記錄。但不是所有異常都是必須記錄的,比如一些可預料並且能讓程式解決的錯誤我們就不需要記錄它。

除了具體的、可預料到的異常外,還有未預料的異常。像這類異常是我們不願意看到了,但發生了也只能暫時結束程式的執行,這裡如果做好了日誌就能為我們解決和除錯問題帶來了方便。還有,要避免使用了try-catch但沒有處理異常的情況,否則就相當於給異常放行(這種情況還不如根本就不去捕獲它)。

處理完異常,我們還應該注意在finally塊中釋放相關資源、還原相關設定資訊等收尾工作。

在做異常處理的時候,最好能在應用程式所有的入口處(事件處理函式,主函式,執行緒入口)使用try-catch。 但是不要在程式建構函式入口處新增try-catch,因為此處產生異常,它自己並沒有能力來處理,因為它還沒有構造完畢,只能再向外層丟擲異常。

在一般情況下使用異常機制來處理錯誤,能使整個程式的結構清晰、**簡單(標識錯誤的**與處理錯誤**分離),但我們也不能盲目使用異常。而且使用異常,可能會在一定程度上影響到程式的效能(c#中使用異常一般不影響效能)。對於一些簡單的、能夠提前避免的錯誤,我們還是應該在try塊外面及早做出處理。如:

trycatch

if(z == 0)

trycatch

附1:測試**

test01() 為一般巢狀異常處理

test02() 為內層 catch 塊中沒有合適的處理程式存在的巢狀異常處理

test03() 為在 catch 塊中丟擲異常的情況(當前處理不了該異常,那麼把它再丟擲)

using system;

using system.io;

public myexception(string message,exception innerexception)

: base(message,innerexception)

}// 例項化異常物件,並丟擲異常

private static void throwexception()

public static void main()

private static void test01()

catch(myexception ex)

catch

finally

console.readline();

}private static void test02()

catch(ioexception ex)

finally

}catch(myexception ex)

catch(exception ex)

finally

console.readline();

}private static void test03()

catch(ioexception ex)

catch(exception ex)

finally

}catch(exception ex)

finally

console.readline();}}

}附2:全域性異常處理、多執行緒中的異常處理

為什麼要把異常處理都交給主線程去做呢?舉個例子:在winform裡我們使用多執行緒來處理介面元素,一旦有異常發生就將異常訊息顯示出來。那麼,是直接在異常發生後就messagebox,還是將訊息交給mainui來統一顯示?試想一下,程式要是複雜點或是有多個介面採用多執行緒來顯示介面元素,那麼採用前者,我們就算知道了異常的詳細資訊,但可能還是很難找到究竟是**出了問題。而通過mainui來顯示,情況就要好很多了,尤其是還設計到其他東西的時候(如:多語言環境)。當然,這個例子只是很小的乙個方面。下面就來看怎麼來實現:

using system;

using system.drawing;

using system.collections;

using system.componentmodel;

using system.windows.forms;

using system.data;

using system.threading;

public frmmain()

///

/// 清理所有正在使用的資源。

///

protected override void dispose( bool disposing )

}base.dispose( disposing );}}

#endregion

public static void mainuithreadexceptionhandler(object sender, threadexceptioneventargs t)

private void throwexception()

private void run()

catch(exception e)

); }

}private void btrun_click(object sender, system.eventargs e)}}

C 之初探異常處理 exception

dail test.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include include include using namespace std int tmain int argc,tchar argv catch o...

初探C 異常機制

c 異常是對程式執行過程中發生的異常情況 例如被0除 的一種相應。異常提供了將控制權從程式的乙個部分轉移到另乙個部分的途徑。對異常的處理有3個組成部分 1 引發異常 2 使用異常處理程式捕捉異常 3 在有可能發生異常的 塊使用try塊 catch關鍵字表示捕獲異常。處理程式以關鍵字catch開頭,隨...

C 異常處理

結構化異常 structured exception vs c 異常 c exception 大家都知道c 異常是c 語言的乙個特性,使用者可以使用throw的方式來丟擲異常,try catch 來捕獲異常。結構化異常是諸如,zero divided,access violations等異常,這些異...