使用异常消息属性检查特定错误是不好的做法吗?

时间:2011-02-21 01:45:19

标签: c# exception exception-handling

有时,异常类型足以表明确切的问题,例如 ArgumentOutOfRangeException 。 Othertimes,例外情况更为笼统,可能会因为多种原因而被抛出。在这种情况下,似乎在异常消息属性中找到了唯一的附加信息。

在我目前的情况下,我收到一个抛出错误消息的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属性。

关于是否应该使用消息属性来确定原因的问题,似乎普遍的共识是除非没有其他选择,否则应该避免使用它。由于本地化,消息属性值在不同的系统中可能不会保持不变。

5 个答案:

答案 0 :(得分:6)

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

您确定无法通过CommunicationException对象上的其他属性解析错误类型:

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

..或者您是否获得了更有用的InnerException?

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

Exception messages in English?

答案 1 :(得分:4)

通常,Exception类的类型(以及可能是自定义异常类的属性)应该是您检查的内容。

如果你处理一些框架或任何写得不好的东西,你没有其他方法可以肯定(没有Data属性或InnerException或任何东西),那么,它是坏的,但你必须。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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