74

在 .NET 解决方案中创建异常类时的最佳实践是:从System.Exception还是从派生System.ApplicationException

4

5 回答 5

63

根据框架设计指南书中的杰弗里·里希特(Jeffery Richter):

System.ApplicationException是一个不应属于 .NET 框架的类。

它旨在具有某种意义,因为您可以潜在地捕获“所有”应用程序异常,但是没有遵循该模式,因此它没有任何价值。

于 2008-09-09T20:02:36.180 回答
29

您应该从System.Exception.

甚至 MSDN 现在都说要忽略ApplicationException

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

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

于 2009-07-06T12:12:28.513 回答
18

ApplicationException认为无用是反对ApplicationException.

结果:不要使用它。源自Exception.

于 2008-09-09T19:58:46.423 回答
13

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

https://web.archive.org/web/20190904221653/https://blogs.msdn.microsoft.com/kcwalina/2006/06/23/applicationexception-considered-useless/

这里有一个很好的跟进:

https://web.archive.org/web/20190828075736/https://blogs.msdn.microsoft.com/kcwalina/2006/07/05/choosing-the-right-type-of-exception-to-throw/

如有疑问,我会遵循他们的《框架设计指南》一书。

http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756

那里进一步讨论了博客文章的主题。

rp

于 2008-09-09T19:58:56.890 回答
1

我习惯这样做:

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 模式。

于 2009-07-06T12:07:49.053 回答