我应该在.NET中从Exception或ApplicationException派生自定义exception吗?

在.NET解决scheme中创buildexception类时的最佳做法是:从System.ExceptionSystem.ApplicationException派生?

根据框架devise指南书中的Jeffery Richter的说法:

System.ApplicationException是一个不应该成为.NET框架的一部分的类。

这意味着你可能会捕捉所有的应用程序exception,但是没有遵循这个模式,所以它没有任何价值。

即使MSDN现在说忽略ApplicationException:

如果您正在devise需要创build自己exception的应用程序,则build议您从Exception类派生自定义exception。 最初认为自定义exception应该从ApplicationException类派生; 然而在实践中,这并没有被发现增加显着的价值。 有关更多信息,请参阅处理exception的最佳实践 。

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

ApplicationException被认为是无用的 – 一个强有力的,批判性的论点。

框架的作者自己认为ApplicationException是毫无价值的:

http://blogs.msdn.com/kcwalina/archive/2006/06/23/644822.aspx

在这里有一个很好的后续:

http://blogs.msdn.com/kcwalina/archive/2006/07/05/657268.aspx

如果有疑问,我遵循他们的书框架devise指南。

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,但是它很好,因为只有很less的类不尊重ApplicationException模式。