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

Luk*_*lch 8 c# exception-handling exception

有时,异常类型足够独特,可以指示确切的问题,例如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;
}
Run Code Online (Sandbox Code Playgroud)

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

结论:

我使用'CommunicationException'的方案是一个糟糕的例子,因为我后来意识到InnerException属性中存在QuotaExceededException.由于回复,我知道要查找异常中存在的任何数据以指出确切原因.在这种情况下,它是InnerException属性.

关于是否应该使用消息属性来确定原因的问题,除非没有替代方案,否则应该避免应该避免的普遍共识.由于本地化,消息属性值可能不会在不同系统上保持不变.

Jam*_*unt 6

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

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

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

..或者你得到一个更有用的InnerException?

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

英文异常消息?