5

在 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");
            }
        }  

这是不好的做法吗?

4

3 回答 3

9

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

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

ArgumentException

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

这可以让你做

try
{
    GetshortMsgCode("arg")
}
catch(ArgumentException e)
{
    //something specific to handle bad args, while ignoring other exceptions
}
于 2012-11-27T13:30:51.430 回答
3

在这种特定情况下,您应该抛出ArgumentException.

具体异常类型的重点是从调用者的角度来考虑。我知道这实际上是相当棘手的,因为您也了解双方的实现细节,因此您也在编写调用代码。但是,请始终尝试思考如何为来电者提供足够的信息,以便清楚地了解如果他们做错了什么。

在这种情况下,简单地抛出Exception意味着他们必须解析错误消息以了解他们做错了什么,而抛出ArgumentException意味着他们可以更容易地区分他们的 try/catch 是否传递给你一些无效的东西或你未能正确执行某些其他原因。

于 2012-11-27T13:34:53.520 回答
1

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

原因是如果你 throw Exception,你的调用者无法区分你引发的错误和他们在调用你的代码期间系统可能抛出的任何其他异常。

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

于 2012-11-27T13:36:47.547 回答