【问题标题】:Is it bad practice to use an exception message property to check for particular error?使用异常消息属性检查特定错误是不好的做法吗?
【发布时间】:2011-06-30 23:57:27
【问题描述】:

有时异常类型的独特性足以指示确切的问题,例如 ArgumentOutOfRangeException。有时,异常更普遍,可能出于多种原因引发。在这种情况下,似乎在异常消息属性中可以找到唯一的附加信息。

在我目前的情况下,我收到了一个抛出错误消息的 CommunicationException:

已超出传入邮件的最大邮件大小配额 (65536)

由于可能会通过 CommunicationException 引发多个不同的错误,因此使用 message 属性来确定原因是不好的做法,如下所示:

catch (CommunicationException ex)
{
    if (Regex.IsMatch(ex.Message, "The maximum message size quota for incoming messages .* has been exceeded"))
    {
        // handle thrown exception
    }
    throw;
}

这些消息在所有系统上是否都是稳定可靠的?是否还有其他考虑因素,例如本地化?

结论:

我的“CommunicationException”场景是一个不好的例子,因为我后来意识到 InnerException 属性中有一个 QuotaExceededException。多亏了这些响应,我知道要查找异常中存在的任何数据以指示确切原因。在本例中,它是 InnerException 属性。

对于是否应该使用消息属性来确定原因的问题,似乎普遍认为应该避免,除非别无选择。由于本地化,消息属性值在不同系统中可能不会保持不变。

【问题讨论】:

    标签: c# exception exception-handling


    【解决方案1】:

    恕我直言,魔术字符串解决方案应始终是最后的手段。

    您确定无法从 CommunicationException 对象的附加属性中解析错误类型吗:

    http://msdn.microsoft.com/en-us/library/system.servicemodel.communicationexception.aspx

    .. 还是你得到一个更有用的 InnerException?

    在回答最后一个问题时,许多 .net 异常消息已本地化。因此,如果要广泛部署此软件,您可能会遇到问题。请参阅以下问题以了解可能的解决方法:

    Exception messages in English?

    【讨论】:

      【解决方案2】:

      是的。

      通常应该检查 Exception 类的类型(如果自定义异常类,可能还有一个属性)。

      如果你处理一些框架或任何写得不好的东西,并且你没有其他方法可以确定(在 Data 属性或 InnerException 中没有任何东西),那么,这很糟糕,但你必须这样做。

      【讨论】:

        【解决方案3】:

        在大多数情况下,您应该能够使用异常类的类型或类的某些属性(例如某些异常类型上的 .ErrorCode),但如果两者都不可能,则使用 .Message 可能是唯一的方法.

        【讨论】:

        • +1 我喜欢这个答案。编程时总会有一些意想不到的事情发生。
        【解决方案4】:

        “使用消息属性来确定原因是不好的做法”

        是的

        【讨论】:

          【解决方案5】:

          简短的回答:是的。这就是为什么他们有不同的类来区分不同的错误。如果你想用强类型来做这样的事情,你可以使用枚举字段来做到这一点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-12
            • 2015-05-31
            • 1970-01-01
            • 2017-02-28
            • 1970-01-01
            • 2012-10-08
            • 1970-01-01
            相关资源
            最近更新 更多