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属性.
关于是否应该使用消息属性来确定原因的问题,除非没有替代方案,否则应该避免应该避免的普遍共识.由于本地化,消息属性值可能不会在不同系统上保持不变.
恕我直言魔术弦解决方案应始终是最后的手段.
您确定无法通过CommunicationException对象上的其他属性解析错误类型:
http://msdn.microsoft.com/en-us/library/system.servicemodel.communicationexception.aspx
..或者你得到一个更有用的InnerException?
在回答最后一个问题时,许多.net异常消息已本地化.因此,如果要广泛部署该软件,您可能会遇到问题.请参阅以下问题以获取可能的解决方法: