捕获和抛出异常的最佳实践

时间:2012-11-27 13:28:00

标签: c# exception

在msdn link中,提到了 不要抛出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");
            }
        }  

这是一个不好的做法吗?

3 个答案:

答案 0 :(得分:9)

一般来说,你可以更明确。

在这种情况下,您可以抛出

ArgumentException

您越具体,其他代码就越容易处理异常。

这允许你做

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

答案 1 :(得分:3)

在这个特定情况下,你应该抛出ArgumentException

特定异常类型的要点是从调用者角度考虑它。我理解当你也在编写调用代码时,这实际上非常棘手,因为你理解双方的实现细节。但是,请始终尝试思考如何为呼叫者提供足够的信息,以便清楚地了解他们做错了什么。

在这种情况下,简单地抛出Exception意味着他们必须解析错误消息以了解他们做错了什么而投掷ArgumentException意味着他们可以更容易地区分他们之间的尝试/捕获通过了一些无效的东西,或者由于其他原因你未能正确执行。

答案 2 :(得分:1)

我不愿意使用像“不良做法”这样的术语,因为在某些情况下几乎所有内容都是正确的。但通常情况下,是的,抛出针对您的情况存在的最具体的异常被认为是更好的,如果不存在特定的异常,则应该定义一个。

原因是如果你抛出Exception,你的调用者就无法区分你所引发的错误以及系统在对代码进行的调用期间可能抛出的任何其他异常。

在许多情况下,调用者可能会决定以不同于其他问题的方式处理您的异常,或者至少他们可能会在知道您的异常发生时记录特定消息。如果您的例外不能轻易与其他例外区分,那么调用者很难实现。