为什么要创build自定义例外?

为什么我们需要在.NET?创build自定义的exception.NET?

特定的海关例外允许您为您的汇票报表分开不同的错误types。 exception处理的常见构造是:

 try {} catch (Exception ex) {} 

这会捕获所有exception,无论types如何。 但是,如果您有自定义exception,则可以为每种types分别使用不同的处理程序:

 try {} catch (CustomException1 ex1) { //handle CustomException1 type errors here } catch (CustomException2 ex2) { //handle CustomException2 type errors here } catch (Exception ex) { //handle all other types of exceptions here } 

因此,特定的exception允许您更好地控制exception处理。 这个好处不仅由自定义exception共享,而且也在.NET系统库中共享所有其他exceptiontypes。

最近我在这个主题上做了一个冗长的博客文章:

http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx

问题的关键在于:只有在以下情况之一时才创build自​​定义exception

  1. 你实际上希望有人来处理它。
  2. 你想logging有关特定错误的信息

所以你也可以自己扔掉,然后抓住他们, 确切地知道他们的意思。

另外:如果你正在构build一个类库/框架/ api,通常会创build一个BaseException,代码中的其他exceptioninheritance自这个exception。 然后,当您的代码引发exception时,正在使用它的程序员可以快速知道exception的来源。

因为它可以使你的意图清晰,你也可以跟踪使用IDEfunction的用法。 假设你有一个名为“FooBar”的自定义后台系统,并且你创build了一个“FooBarDownException”,你可以跟踪这个exception的用法来识别你的应用程序包含的任何自定义逻辑,因为FooBar已经closures。 您可以select捕获此特定types的exception并忽略其他exception,从而避免exception处理程序中的重载和条件逻辑。 这实际上只是另一个强大的打字版本。 这也意味着你可以在你的代码中避免注释,因为这个exception有意向显示名字

我不知道为什么“技术上”,但可以说我有一个使用权限的应用程序/网站。 如果有人没有正确的权限,它有点愚蠢的抛出DivideByZeroexception或IOException。 相反,我可以创build我的AccessDeniedException,这将有助于我稍后debugging。

这与为非.NET应用程序创build不同退出代码的原因相同:指定不同的特定于应用程序的错误。 就像… ConnectionBrokenException或者是… UserSmellsBadException …或者其他东西。

这样你就可以确切地知道什么地方出了问题,并采取适当的行动 例如,如果尝试发送一些数据,并且数据传输类引发了ConnectionBrokenException ,则可以popup一个重新连接对话框并尝试重新连接。 然后,如果超时,reconnect方法会抛出ConnectionTimeoutException ,并且可以再次适当地执行。

正如乔尔写道:所以你也可以自己扔掉,然后抓住他们,确切地知道他们的意思。

另外,您可以添加有关该问题的特定信息,以便让您的exception处理程序更加准确。

标准的.NET例外不包括在任何应用程序中可能出错的所有错误,也不包括它们的意图。 除非你的程序非常简单,否则很可能你将不得不创build至less一些自定义exception。

另一个原因,当一个客户端接口的谈话。 由于客户端并不知道接口的实现,因为他们可能会抛出不同的exception,所以创build自定义exception来统一抛出的错误是一个很好的地方。

我写了这个特例:

http://blog.mikecouturier.com/2010/01/creating-custom-exceptions-in-net-right.html

首先,例外是​​在库中实现的,而不是在语言中实现 – 他们如何在库中创build例外? 我敢肯定,你并不是主张系统库应该有一套不同的规则。

另一方面,实际上可以使用exception的对象树。 如果你喜欢,你的inheritanceexception可以有特殊的属性 – 它们可以被用于比它们更复杂的事情。 我不主张将它们用作通用数据传输机制或任何东西(虽然它们可能是),但是我可以看到某个人实现了一个自定义日志logging解决scheme的情况,这个解决scheme需要Exception上的特殊属性…

你的自定义exception可能包含一个标志,指示特殊处理(也许有人说你应该重新启动JVM),他们可能包含有关日志级别,一堆东西的信息。

无论如何,我不主张这个东西,我只是说这是可能的。 第一段是你真正的答案。

如果内置的exception适当地描述了问题/exception,则不应该这样做。 我不会让我自己的基类创build一个自定义的ArgumentExceptionArgumentNullExceptionInvalidOperationException

您可以创build自己的例外,并在更高级别上描述错误。 然而,这通常不会从消费者类中进行debugging。

如果你自己抛出并捕获exception,则可能需要自定义exception。