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


74

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

Answers:


63

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

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

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


3
令人难以置信的是,当人们考虑将Microsoft Press的MCTS 70-536考试材料明确地说出来时,事实恰恰相反。
戴夫·劳伦斯

永远不要完全信任MS考试书。我读过的书很少-总是充满错误。
user1068352 '02

这实际上并不能回答问题。您是说自定义应用程序异常应继承自Exception?如果是这样,你能这样说吗?
Patrick Szalapski

28

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

现在甚至MSDN都说要忽略ApplicationException

如果要设计需要创建自己的异常的应用程序,建议您从Exception类派生自定义异常。最初认为自定义异常应该从ApplicationException类派生。然而,在实践中,尚未发现这可以增加重大价值。有关更多信息,请参见处理异常的最佳实践

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


1
引言的确是这样,但可以,将其编辑得更明确。
Blorgbeard将于


13

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


2
您所了解的很少。遵循框架设计指南的任何人都不会源自ApplicationException。如果要维护此模式,则需要创建自己的类型(如MyApplicationExcptionBase)并从中派生所有自定义异常。顺便说一句,《准则》说,要创建很少的派生异常类型。
约翰·桑德斯

您说对了:今天,如果必须从头开始,我将创建一个“ UserError”异常。但是,我不会重构我的旧代码:它不是很严格。
2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.