Jam*_*mes 162 .net c# exception-handling exception
为了抛出异常,我通常使用内置的异常类,例如ArgumentNullException和NotSupportedException.但是,有时我需要使用自定义异常,在这种情况下我写:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
Run Code Online (Sandbox Code Playgroud)
等等.然后我在我的代码中抛出并捕获它们.但今天我遇到了ApplicationException全班 - 我应该使用它吗?这是为了什么?
拥有许多具有不同名称的有效相同的异常类似乎效率低下(我通常不需要任何单独的功能).但我不喜欢捕获泛型ApplicationException并且必须使用额外代码来确定错误是什么的想法.
哪里应该ApplicationException适合我的代码?
Qui*_*ith 138
简短的回答是:无处可去.
它是过去的遗留物,Microsoft希望开发人员从ApplicationException继承所有自定义异常.不久之后,他们改变主意,并建议自定义异常应该来自基本的Exception类.请参阅在MSDN上处理异常的最佳实践.
其中一个更为广为流传的原因来自Jeffery Richter在框架设计指南中的一个例外:
System.ApplicationException是一个不应该是.NET Framework一部分的类.最初的想法是从SystemException派生的类将指示从CLR(或系统)本身抛出的异常,而非CLR异常将从ApplicationException派生.但是,很多异常类都没有遵循这种模式.例如,TargetInvocationException(由CLR抛出)是从ApplicationException派生的.因此,ApplicationException类失去了所有意义.从这个基类派生的原因是允许调用堆栈上方的某些代码捕获基类.不再可能捕获所有应用程序异常.
所以你有它.执行摘要是ApplicationException没有害处,只是没用.
Fem*_*ref 92
根据msdn 的评论:
用户应用程序(而不是公共语言运行库)抛出从ApplicationException类派生的自定义异常.ApplicationException类区分应用程序定义的异常与系统定义的异常.
如果您正在设计需要创建自己的异常的应用程序,建议您从Exception类派生自定义异常.最初认为自定义异常应该来自ApplicationException类; 然而,在实践中,尚未发现这增加了重要价值.有关更多信息,请参阅处理异常的最佳实践.
从中获取它们Exception.此外,只要有必要,我认为为您的案例创建新的例外没有问题.如果您遇到框架中已经存在异常的情况,请使用它,否则,请自行滚动.
aba*_*hev 19
在最初的设计中,在.NET 1.0中,计划框架本身将抛出SystemException并派生; 用户应用程序 - 将抛出ApplicationException和派生.
但后来,在.NET 2.0中,它被删除了.
因此得出Exception.