例外狀況,例外狀況處理介紹
訂閱 375
例外狀況
例外狀況用來表示一種非正常情況,他未必是一個錯誤,但卻足以影響目前的工作流程。在一臺電腦中,例外狀況可能來自於硬體,作業系統,或某種語言,本節中我們只討論最後一種情況。
在例外狀況發生時確保重要的程式碼始終被執行
例外狀況的發生通常伴隨著控製權的轉移,這表示一部分本應被執行的程式碼可能被忽略,如果這些程式碼包含了重要的操作,比如資源的釋放,那麽請考慮進行調整,以確保他們始終被執行。
擲回例外狀況
對於支援例外狀況的語言,其自身具有的函式或方法可能已經編寫了擲回例外狀況的程式碼,而開發人員可以對自己定義的函式或方法實施同樣的操作。一旦例外狀況被擲回,控製權將轉移至攔截該例外狀況的程式碼處。
什麽情況下可以擲回例外狀況?
如果你希望,那麽任何情況下都可以擲回一個例外狀況,但這種行為需要針對真正無法處理的問題,業務邏輯本身應該具備一定的錯誤修正能力,當問題導致業務無法繼續時,可用例外狀況來通知可能的呼叫方。
比如,當某個無關緊要的參數丟失時,我們可以為其指定一個預設值,只要整個邏輯的可靠性沒有被破壞。
在下面的 C# 函式Divide
中,如果除數為0
,我們會擲回一個例外狀況。
// 函式 Divide,實作除法,會檢查除數是否有問題
int Divide(int dividend, int divisor)
{
// 除數不能為 0,否則擲回例外狀況
if (divisor == 0)
throw new Exception("參數 divisor 不能為 0!");
return dividend / divisor;
}
攔截例外狀況
在處理例外狀況之前,需要圈定一段程式碼,以攔截其中可能被擲回的例外狀況,對於攔截到的例外狀況,你可以根據其型別以及包含的資料,給予相應的處理。
關於例外狀況的型別,除了語言預先包括的,也可以自行定義。
什麽是未攔截例外狀況?
顧名思義,未攔截例外狀況是指被擲回但未被攔截的例外狀況,未攔截例外狀況會嘗試傳播至上一級呼叫方,如果所有程式碼均未攔截他,那麽系統或語言執行環境將對其進行預設處理。
什麽情況下需要攔截例外狀況?
當程式碼擲回的例外狀況,嚴重到影響業務邏輯的正常運作,並且你已經確定了可行的應對方案時,就可以對其進行攔截。
下面的try…catch
陳述式將攔截函式Divide
擲回的例外狀況,並將顯示例外狀況資訊作為處理方式。
// 攔截和處理例外狀況
try
{
// 除數為 0,將擲回例外狀況
Divide(7, 0);
}
catch (Exception err)
{
// 簡單的顯示例外狀況的資訊
Console.WriteLine($"糟糕,出現一個例外狀況!{err.Message}");
}
糟糕,出現一個例外狀況!參數 divisor 不能為 0!
全域例外狀況處理
在一些語言中,對例外狀況進行全域處理是可能的,你將集中處理程式中所有未被攔截的例外狀況。看上去這帶來了很大的便利,但該方式很少能解決具體問題,通常只是進行例外狀況的記錄工作,因為距離例外狀況產生的位置可能已經很遠,想通過編寫程式碼來實施補救會比較困難。
當然,情況並非一成不變,當希望對某一類例外狀況進行統一處理時,全域處理將是不錯的選擇。比如,我們希望在 Web 伺服器出現某種例外狀況時,為使用者展示一個特定的頁面。