2011-04-16 39 views
134

为了抛出异常,我通常使用内置的异常类,例如ArgumentNullExceptionNotSupportedException。但是,有时我需要使用自定义例外,并在这种情况下我写:什么是ApplicationException在.NET中?

class SlippedOnABananaException : Exception { } 
class ChokedOnAnAppleException : Exception { } 

等等。然后我在代码中抛出并捕获它们。但是今天我碰到了ApplicationException课 - 我应该使用它吗?这是为了什么?

有很多有效的相同的异常类与不同的名称(我通常不需要任何单独的功能)似乎效率低下。但我不喜欢捕捉一个通用的ApplicationException,并不得不使用额外的代码来确定错误是什么。

ApplicationException哪里应该符合我的代码?

+21

伟大的问题,也是巧妙命名的示例异常的+1 – 2011-04-16 10:43:14

+0

相关:http://stackoverflow.com/questions/16603065/applicationexception-or-create-custom-exceptions。 – 2014-07-24 17:26:50

+0

@CodyGray你为什么认为这些异常名称很聪明?我的意思是我们应该如何命名一个例外? :) – Beatles1692 2015-04-29 10:12:31

回答

82

根据MSDN中的remarks

用户应用程序,而不是公共语言运行时,抛出从ApplicationException的类派生自定义异常。 ApplicationException类区分应用程序定义的异常和系统定义的异常。

如果您正在设计需要创建自己异常的应用程序,建议您从Exception类派生自定义异常。最初认为自定义异常应该来自ApplicationException类;然而在实践中,这并没有被发现增加显着价值。有关更多信息,请参阅处理异常的最佳实践。

Exception导出它们。另外,只要有担保,我认为您的案件不会出现新的例外情况。如果遇到框架中已经存在异常的情况,请使用该框架,否则请自行推出。

+6

所以看起来'ApplicationException'是无用的,仅仅是因为向后兼容性? – Beatles1692 2015-04-29 10:10:24

16

在最初的设计中,在.NET 1.0中,计划框架本身将抛出SystemException并派生出来;而用户应用程序 - 将抛出ApplicationException并派生。

但是后来,在.NET 2.0中,这种情况被抛弃了。因此得自Exception

110

简短的回答是:无处。

这是过去的遗迹,微软希望开发人员从ApplicationException继承所有自定义异常。不久之后,他们改变了主意,并建议自定义异常应该从基类Exception类派生。请参阅MSDN上的Best Practices for Handling Exceptions

一个这样做的更加广为流传的原因来自于从杰弗里里氏的exerpt在Framework Design Guidelines

System.ApplicationException是,不应该是.NET Framework的一部分的类。最初的想法是,从SystemException派生的类将指示从CLR(或系统)本身抛出的异常,而非CLR异常将从ApplicationException派生。但是,很多异常类并没有遵循这种模式。例如,TargetInvocationException(由CLR抛出)源自ApplicationException。所以,类丢失了全部含义。从这个基类派生出来的原因是允许调用堆栈中的某些代码更高地捕获基类。不可能再捕捉所有的应用程序异常。

所以你有它。执行摘要是ApplicationException不是有害,只是没用

+2

有谁知道*为什么*是?这似乎是有道理的,这样你可以显示应用程序例外,但不会“程序员搞砸”例外。 – 2012-07-09 21:13:31

+1

答复已更新,以回应@JoshKodroff。 – 2012-07-10 12:16:21

+7

顺便说一句,从这个解释看来,这本身并不是一个糟糕的设计,但是MSFT搞砸了这个实现。其他人是否也有类似的阅读? – 2012-07-10 16:26:52