我应该从 .NET 中的 Exception 或 ApplicationException 派生自定义异常吗?
题
在 .NET 解决方案中创建异常类时的最佳实践是什么:源自 System.Exception
或来自 System.ApplicationException
?
解决方案
根据 Jeffery Richter 在《框架设计指南》一书中的说法:
System.ApplicationException
是一个不应该成为 .NET 框架一部分的类。
它的目的是具有某种意义,因为您可以潜在地捕获“所有”应用程序异常,但是没有遵循该模式,因此它没有任何价值。
其他提示
您应该从中派生自定义异常 System.Exception
.
甚至 MSDN 现在也说忽略 ApplicationException
:
如果您正在设计需要创建自己的异常的应用程序,则建议您从异常类中得出自定义异常。最初认为自定义应从ApplicationException类得出。但是,实际上尚未发现这增加了重大价值。有关更多信息,请参阅 处理异常的最佳实践.
http://msdn.microsoft.com/en-us/library/system.applicationexception.aspx
ApplicationException
被认为无用 是一个强有力的、批判性的反对论据 ApplicationException
.
结果:不要使用它。从获得 Exception
.
该框架的作者自己认为 ApplicationException 毫无价值:
http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx
这里有一个很好的后续:
http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx
如有疑问,我会遵循他们的书《框架设计指南》。
http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756
博客文章的主题将在那里进一步讨论。
RP
我习惯这样做:
private void buttonFoo_Click()
{
try
{
foo();
}
catch(ApplicationException ex)
{
Log.UserWarning(ex);
MessageVox.Show(ex.Message);
}
catch(Exception ex)
{
Log.CodeError(ex);
MessageBox.Show("Internal error.");
}
}
它允许区分:
- 我必须修复的 C# 代码系统错误。
- “正常”用户错误,不需要我纠正。
我知道不建议使用 ApplicationException,但它效果很好,因为有 课程很少 不遵守 ApplicationException 模式。