【问题标题】:Derive from ApplicationException or not?是否从 ApplicationException 派生?
【发布时间】:2019-05-20 16:21:33
【问题描述】:

我对何时使用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 的真正目的是什么?

【问题讨论】:

    标签: .net inheritance exception exception-handling


    【解决方案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),而您正期待 您的代码 出现异常。

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

    【讨论】:

    • 我完全忘记了在 MSDN 上查找哪些类是从一个类派生的很容易。感谢您指出了这一点!这是我需要的信息,以确保我们确实不想使用ApplicationException。非常感谢。
    猜你喜欢
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-15
    相关资源
    最近更新 更多