我应该从.NET中的Exception或ApplicationException派生自定义异常吗?

我应该从.NET中的Exception或ApplicationException派生自定义异常吗?

Should I derive custom exceptions from Exception or ApplicationException in .NET?

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


根据Jeffery Richter在《框架设计指南》一书中所说:

System.ApplicationException is a class that should not be part of the .NET framework.

它旨在具有某些意义,因为您可能会捕获"所有"应用程序异常,但是未遵循该模式,因此它没有任何价值。


您应该从System.Exception派生自定义异常。

现在甚至MSDN都说忽略ApplicationException

If you are designing an application
that needs to create its own
exceptions, you are advised to derive
custom exceptions from the Exception
class. It was originally thought that
custom exceptions should derive from
the ApplicationException class;
however in practice this has not been
found to add significant value. For
more information, see Best Practices for Handling Exceptions.

http://msdn.microsoft.com/zh-CN/library/system.applicationexception.aspx


认为无用的ApplicationException是反对ApplicationException的有力且至关重要的论据。

结果:请勿使用。从Exception派生。


该框架的作者自己认为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/

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

博客文章的主题将在此处进一步讨论。

rp


我曾经做过:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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模式的类,因此效果很好。


推荐阅读