我对何时使用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的真正目的是什么?
答案 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
列表还不完整,因为还有其他列表:DataSourceSerializationException
,AppConfigException
,NameValidationException
和其他...
因此,只要抛出其中之一,它就会在您期望您的代码出现异常时击中您的catch (ApplicationException exception)
。
我强烈建议您继续使用您的自定义基本异常。