为何创建自定义异常?

为什么我们需要在.NET?中创建自定义异常

Yoann. B asked 2019-11-15T10:06:47Z
11个解决方案
55 votes

特定的海关例外允许您为catch语句分隔不同的错误类型。 异常处理的常见构造是这样的:

try
{}
catch (Exception ex)
{}

这捕获所有类型的异常。 但是,如果您具有自定义异常,则可以为每种类型使用单独的处理程序:

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
}

因此,特定的异常使您可以更好地控制异常处理。 此优点不仅由自定义异常共享,而且.NET系统库中的所有其他异常类型也共享。

Jon Limjap answered 2019-11-15T10:07:13Z
40 votes

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

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

问题的症结在于:仅当满足以下条件之一时才创建自定义异常

  1. 您实际上希望有人来处理。
  2. 您要记录有关特定错误的信息
JaredPar answered 2019-11-15T10:08:03Z
19 votes

因此,您也可以自己扔掉它们,然后抓住它们并确切知道它们的含义。

另外:如果您要构建类库/框架/ api,则创建一个BaseException通常会很有用,您的代码中的其他异常都可以从此继承。 然后,当您的代码引发异常时,正在使用它的程序员就可以快速知道异常的来源。

Joel Coehoorn answered 2019-11-15T10:08:34Z
11 votes

因为它可以使您的意图明确,而且还可以使用IDE功能跟踪使用情况。 假设您有一个名为“ FooBar”的自定义后端系统,并且创建了“ FooBarDownException”,则可以跟踪此异常的用法,以识别由于FooBar关闭而导致应用程序包含的任何自定义逻辑。 您可以选择捕获这种特定类型的异常,而忽略其他异常,从而避免异常处理程序中的重载和条件逻辑。 它实际上只是强类型打字的另一个版本。 这也意味着您可以避免在代码中添加注释,因为该异常具有显示名称的意图。

krosenvold answered 2019-11-15T10:08:59Z
3 votes

我不确定为什么“技术上”,但可以说我有一个使用权限的应用程序/网站。 如果某人没有正确的权限,则抛出DivideByZero Exception或IOException有点愚蠢。 相反,我可以创建AccessDeniedException,它将帮助我稍后进行调试。

masfenix answered 2019-11-15T10:09:23Z
3 votes

与为非.NET应用程序创建不同的退出代码的原因相同:指定不同的应用程序特定错误。 例如... ConnectionBrokenException或um ... ConnectionTimeoutException ...

这样,您可以确切地知道出了什么问题并采取适当的措施。 例如,如果您尝试发送一些数据并且数据传输类抛出ConnectionBrokenException,则可以弹出一个重新连接对话框并尝试重新连接。 如果超时,重新连接方法将抛出ConnectionTimeoutException,并且您可以再次采取适当措施。

lc. answered 2019-11-15T10:09:55Z
3 votes

另一个原因,当客户与接口对话时。 由于客户端不知道接口的实现,并且由于它们可能会抛出不同的异常,因此创建自定义异常以统一抛出的错误的好地方。

我写了这个特殊情况:

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

Mike Gleason jr Couturier answered 2019-11-15T10:10:34Z
2 votes

正如乔尔(Joel)所说:因此,您也可以自己扔掉它们,然后抓住它们并确切知道它们的含义。

另外,您可以添加有关问题的特定信息,以使异常处理程序更准确地执行操作。

Serge Wautier answered 2019-11-15T10:11:06Z
1 votes

标准的.NET异常并未涵盖所有可能在任何应用程序中出错的不良情况,也并非旨在如此。 除非您的程序非常简单,否则您可能至少必须创建一些自定义异常。

mhenry1384 answered 2019-11-15T10:11:30Z
0 votes

一方面,异常是在库中实现的,而不是在语言中实现的—它们如何在库中创建异常? 我敢肯定,您不是在提倡系统库应该有不同的规则集。

另外,实际上有可能使用异常的对象树。 如果愿意,您继承的异常可以具有特殊的属性-它们可以用于比它们更复杂的事情。 我不主张将它们用作通用数据传输机制或其他任何东西(尽管可以使用),但是我可以看到有人实现了自定义日志记录解决方案的情况,该解决方案要求在Exception上具有特殊属性...

您的自定义异常可能包含指示特殊处理的标志(也许有人说您应该重新启动JVM),它们可能包含有关日志记录级别的信息,诸如此类。

无论如何,我不是在提倡这些东西,我只是说这是可能的。 第一段是您的真实答案。

Bill K answered 2019-11-15T10:12:16Z
0 votes

如果内置的异常适当地描述了问题/异常,则不应该这样做。 我不会创建自己的基类来创建自定义ArgumentExceptionArgumentNullExceptionInvalidOperationException

您可以创建自己的异常,并在更高级别上描述错误。 但是,这通常无法从使用者类进行调试。

如果您自己抛出并捕获异常,则可能是自定义异常。

Øyvind Skaar answered 2019-11-15T10:12:55Z
translate from https://stackoverflow.com:/questions/417428/why-create-custom-exceptions