簡體   English   中英

捕獲和拋出異常的最佳實踐

[英]Best practices for Catching and throwing the exception

在msdn 鏈接中 ,提到了
不要拋出System.Exception或System.SystemException。
在我的代碼中,我是這樣扔的

private MsgShortCode GetshortMsgCode(string str)
        {
            switch (str.Replace(" ","").ToUpper())
            {
                case "QNXC00":
                    return MsgShortCode.QNXC00;
                default:
                    throw new Exception("Invalid message code received");
            }
        }  

這是一個不好的做法?

一般來說,你可以更明確。

在這種情況下,你可以扔一個

ArgumentException

您越具體,其他代碼處理異常就越容易。

這可以讓你做到

try
{
    GetshortMsgCode("arg")
}
catch(ArgumentException e)
{
    //something specific to handle bad args, while ignoring other exceptions
}

在這個特定的實例中,您應該拋出ArgumentException

特定異常類型的要點是從調用者的角度考慮它。 我理解當你也在編寫調用代碼時,這實際上非常棘手,因為你理解雙方的實現細節。 但是,請始終嘗試思考如何為呼叫者提供足夠的信息,以便清楚地了解他們做錯了什么。

在這種情況下,簡單地拋出Exception將意味着他們必須解析錯誤消息以理解他們做錯了什么,而拋出ArgumentException意味着他們可以更容易地區分他們之間的嘗試/捕獲他們已經通過你無效或你未能正確執行由於其他原因。

我不願意使用像“不良做法”這樣的術語,因為在某些情況下幾乎所有內容都是正確的。 但通常,是的,拋出針對您的情況存在的最具體的異常被認為是更好的,如果不存在特定的異常,則應該定義一個異常。

原因是如果您拋出Exception ,您的調用者無法區分您正在引發的錯誤以及系統在對代碼進行的調用期間可能拋出的任何其他異常。

在許多情況下,調用者可能決定以不同於其他問題的方式處理您的異常,或者至少他們可能會在知道您的異常發生時記錄特定消息。 如果您的例外不能輕易與其他人區分開來,那么調用者很難實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM