是否从ApplicationException派生?

时间:2018-12-20 06:48:22

标签: .net inheritance exception exception-handling

我对何时使用ApplicationException感到困惑。在页面上注明

  

用作应用程序定义的异常的基类。

在同一页面上有以下警告

  

您应该从Exception类而不是ApplicationException类派生自定义异常。您不应在代码中引发ApplicationException异常,也不应捕获ApplicationException异常,除非您打算重新引发原始异常。

因此,它应作为应用程序定义的异常的基类,但不应派生或捕获。不幸的是,该警告未说明任何进一步的推理。

在我们的应用程序中,我们想要捕获所有应用程序定义的异常,并将其与.net本身的异常区别对待。因此,我们捕获了一个通用异常,所有应用程序定义的异常都源自该异常。

所以不要这样做

catch(AppCustomException ex) { ... }
catch(AnotherAppCustomException ex) { ... }
catch(YetAnotherAppCustomException ex) { ... }

我们有

catch(BaseCustomException ex) { ... } //All app custom exceptions derive from this type

我认为最好以ApplicationException作为所有自定义应用定义的异常的基础,而不是本例中的BaseCustomException

一位同事争辩说,由于MSDN上所述,我们不能将ApplicationException用于这种常见的基本异常类型。特别是,它不应源自或在未重新获得时也不会被捕获。由于某种原因,我们不会抛出这些异常。

所以我现在很困惑。 ApplicationException的真正目的是什么?

1 个答案:

答案 0 :(得分:1)

一大堆异常都在本机.NET库中继承ApplicationException。我没有证据来源,但是据我了解,它打算用于.NET库中的应用程序定义的异常

如果事实并非如此,那么为ApplicationException派生的应用程序创建自定义异常时将面临的问题是,您可能会捕获一大堆您没有的.NET异常关心或什至无法处理。基本上,每个catch都需要进行检查,以确保您从自己的应用程序而不是.NET中捕获异常。

在发布了链接的文档页面中,获取源自ApplicationException的异常列表。

 Microsoft.JScript.BreakOutOfFinally
 Microsoft.JScript.ContinueOutOfFinally 
 Microsoft.JScript.JScriptException 
 Microsoft.JScript.NoContextException
 Microsoft.JScript.ReturnOutOfFinally
 System.Reflection.InvalidFilterCriteriaException
 System.Reflection.TargetException
 System.Reflection.TargetInvocationException
 System.Reflection.TargetParameterCountException
 System.Threading.WaitHandleCannotBeOpenedException

列表还不完整,因为还有其他列表:DataSourceSerializationExceptionAppConfigExceptionNameValidationException和其他...

因此,只要抛出其中之一,它就会在您期望您的代码出现异常时击中您的catch (ApplicationException exception)

我强烈建议您继续使用您的自定义基本异常。