什么是.net中的ApplicationException ?
本文关键字:ApplicationException 中的 net 什么 | 更新日期: 2023-09-27 17:50:32
抛出异常,我通常使用内置异常类,例如ArgumentNullException
和NotSupportedException
。然而,有时我需要使用自定义异常,在这种情况下,我这样写:
class SlippedOnABananaException : Exception { }
class ChokedOnAnAppleException : Exception { }
等等。然后我在代码中抛出并捕获这些。但今天我遇到了ApplicationException
类-我应该用它代替吗?这是干什么用的?
拥有许多具有不同名称的有效相同的Exception类似乎效率低下(我通常不需要任何单独的功能)。但是我不喜欢捕捉一个通用的ApplicationException
,并且必须使用额外的代码来确定错误是什么。
ApplicationException
应该在哪里适合我的代码?
简短的回答是:无处可去。
这是过去的遗物,微软希望开发人员从ApplicationException中继承所有自定义异常。不久之后,他们改变了主意,建议自定义异常应该从Exception基类派生。请参阅处理MSDN上异常的最佳实践。
其中一个广为流传的原因来自Jeffery Richter在《框架设计指南》中的一段话:系统。ApplicationException是一个不应该成为。net框架一部分的类。最初的想法是,从SystemException派生的类将指示从CLR(或系统)本身抛出的异常,而非CLR异常将从ApplicationException派生。然而,许多异常类并没有遵循这种模式。例如,TargetInvocationException(由CLR抛出)派生自ApplicationException。因此,ApplicationException类失去了所有意义。从这个基类派生的原因是允许调用堆栈更上层的一些代码捕获基类。捕获所有应用程序异常已不再可能。
就是这样了。执行摘要是ApplicationException不是有害的,只是无用的。
根据msdn中的备注:
用户应用程序,而不是公共语言运行库,抛出从ApplicationException类派生的自定义异常。ApplicationException类区分应用程序定义的异常和系统定义的异常。
如果您正在设计一个需要创建自己的异常的应用程序,建议您从Exception类派生自定义异常。最初认为自定义异常应该从ApplicationException类派生;然而,在实践中,并没有发现这增加了显著的价值。有关更多信息,请参见处理异常的最佳实践。
从Exception
导出。此外,我不认为为您的案例创建新的异常有什么问题,只要它是有保证的。如果您遇到框架中已经存在异常的情况,请使用该异常,否则,请滚动您自己的异常。
在最初的设计中,在。net 1.0中,计划框架本身将抛出SystemException
和派生;而用户应用程序-将抛出ApplicationException
和派生。
但是后来,在。net 2.0中,它被删除了。
由此衍生自Exception