有时,异常类型足以表明确切的问题,例如 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属性。
关于是否应该使用消息属性来确定原因的问题,似乎普遍的共识是除非没有其他选择,否则应该避免使用它。由于本地化,消息属性值在不同的系统中可能不会保持不变。
答案 0 :(得分:6)
恕我直言魔术弦解决方案应始终是最后的手段。
您确定无法通过CommunicationException对象上的其他属性解析错误类型:
http://msdn.microsoft.com/en-us/library/system.servicemodel.communicationexception.aspx
..或者您是否获得了更有用的InnerException?
在回答最后一个问题时,许多.net异常消息已本地化。因此,如果要广泛部署该软件,您可能会遇到问题。请参阅以下问题,了解可能的解决方法:
答案 1 :(得分:4)
是
通常,Exception类的类型(以及可能是自定义异常类的属性)应该是您检查的内容。
如果你处理一些框架或任何写得不好的东西,你没有其他方法可以肯定(没有Data属性或InnerException或任何东西),那么,它是坏的,但你必须。
答案 2 :(得分:1)
在大多数情况下,您应该能够使用异常类的类型或类的某些属性(如某些异常类型上的.ErrorCode),但如果两者都不可能,则使用.Message可能是唯一的方法
答案 3 :(得分:0)
“使用message属性确定原因是不好的做法”
是
答案 4 :(得分:0)
简短回答:是的。这就是为什么他们有不同的类来区分不同的错误。如果你想通过强类型做这样的事情,你可以使用枚举字段来做到这一点。