URLhttps://learnscript.net/zh-hant/programming/operations/exceptions/
    複製連結移至說明  範例

    例外狀況,例外狀況處理介紹

    閱讀 4:11·字數 1255·發佈 
    Youtube 頻道
    訂閱 375

    例外狀況

    例外狀況用來表示一種非正常情況,他未必是一個錯誤,但卻足以影響目前的工作流程。在一臺電腦中,例外狀況可能來自於硬體,作業系統,或某種語言,本節中我們只討論最後一種情況。

    在例外狀況發生時確保重要的程式碼始終被執行

    例外狀況的發生通常伴隨著控製權的轉移,這表示一部分本應被執行的程式碼可能被忽略,如果這些程式碼包含了重要的操作,比如資源的釋放,那麽請考慮進行調整,以確保他們始終被執行。

    擲回例外狀況

    對於支援例外狀況的語言,其自身具有的函式或方法可能已經編寫了擲回例外狀況的程式碼,而開發人員可以對自己定義的函式或方法實施同樣的操作。一旦例外狀況被擲回,控製權將轉移至攔截該例外狀況的程式碼處。

    什麽情況下可以擲回例外狀況?

    如果你希望,那麽任何情況下都可以擲回一個例外狀況,但這種行為需要針對真正無法處理的問題,業務邏輯本身應該具備一定的錯誤修正能力,當問題導致業務無法繼續時,可用例外狀況來通知可能的呼叫方。

    比如,當某個無關緊要的參數丟失時,我們可以為其指定一個預設值,只要整個邏輯的可靠性沒有被破壞。

    在下面的 C# 函式Divide中,如果除數為0,我們會擲回一個例外狀況。

    *.cs
    // 函式 Divide,實作除法,會檢查除數是否有問題
    int Divide(int dividend, int divisor)
    {
    	// 除數不能為 0,否則擲回例外狀況
    	if (divisor == 0)
    		throw new Exception("參數 divisor 不能為 0!");
    
    return dividend / divisor; }

    攔截例外狀況

    在處理例外狀況之前,需要圈定一段程式碼,以攔截其中可能被擲回的例外狀況,對於攔截到的例外狀況,你可以根據其型別以及包含的資料,給予相應的處理。

    關於例外狀況的型別,除了語言預先包括的,也可以自行定義。

    什麽是未攔截例外狀況?

    顧名思義,未攔截例外狀況是指被擲回但未被攔截的例外狀況,未攔截例外狀況會嘗試傳播至上一級呼叫方,如果所有程式碼均未攔截他,那麽系統或語言執行環境將對其進行預設處理。

    什麽情況下需要攔截例外狀況?

    當程式碼擲回的例外狀況,嚴重到影響業務邏輯的正常運作,並且你已經確定了可行的應對方案時,就可以對其進行攔截。

    下面的try…catch陳述式將攔截函式Divide擲回的例外狀況,並將顯示例外狀況資訊作為處理方式。

    *.cs
    // 攔截和處理例外狀況
    try
    {
    	// 除數為 0,將擲回例外狀況
    	Divide(7, 0);
    }
    catch (Exception err)
    {
    	// 簡單的顯示例外狀況的資訊
    	Console.WriteLine($"糟糕,出現一個例外狀況!{err.Message}");
    }
    糟糕,出現一個例外狀況!參數 divisor 不能為 0!

    全域例外狀況處理

    在一些語言中,對例外狀況進行全域處理是可能的,你將集中處理程式中所有未被攔截的例外狀況。看上去這帶來了很大的便利,但該方式很少能解決具體問題,通常只是進行例外狀況的記錄工作,因為距離例外狀況產生的位置可能已經很遠,想通過編寫程式碼來實施補救會比較困難。

    當然,情況並非一成不變,當希望對某一類例外狀況進行統一處理時,全域處理將是不錯的選擇。比如,我們希望在 Web 伺服器出現某種例外狀況時,為使用者展示一個特定的頁面。

    原始碼

    exceptions.cs·codebeatme/programming·GitHub