为什么我们需要在.NET?
答案 0 :(得分:52)
特定的海关例外允许您为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
}
Ergo,特定的例外允许您对异常处理进行更精细的控制。此好处不仅由自定义异常共享,还在.NET系统库中共享所有其他异常类型。
答案 1 :(得分:40)
我最近在这个主题上做了很长篇博文:
http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx
它的关键在于:只有在以下其中一项成立时才创建自定义异常
答案 2 :(得分:18)
所以你也可以自己扔掉它们,然后抓住它们并且知道完全它们的含义。
另外:如果你正在构建一个类库/ framework / api,那么创建一个BaseException通常会很有用,因为代码中的其他异常都会从中继承。然后,当您的代码引发异常时,使用它的程序员可以快速了解异常的来源。
答案 3 :(得分:11)
因为它可以使您的意图清晰,您还可以使用IDE功能跟踪用法。假设您有一个名为“FooBar”的自定义后端系统,并且您创建了一个“FooBarDownException”,您可以跟踪此异常的用法,以识别您的应用程序包含的任何自定义逻辑,因为FooBar已关闭。您可以选择捕获此特定类型的异常并忽略其他异常,从而避免异常处理程序中的重载和条件逻辑。它实际上只是强类型的另一个版本。这也意味着您可以避免代码中的注释,因为异常具有意图揭示名称。
答案 4 :(得分:3)
我不确定为什么“技术上”,但我想说我有一个使用权限的应用/网站。如果有人没有正确的权限,那么抛出DivideByZero异常或IOException有点愚蠢。相反,我可以创建我的AccessDeniedException,它将帮助我稍后调试。
答案 5 :(得分:3)
这与为非.NET应用程序创建不同退出代码的原因相同:指定不同的特定于应用程序的错误。就像...... ConnectionBrokenException
或嗯...... UserSmellsBadException
......或其他东西。
通过这种方式,您可以确切地知道出了什么问题并采取了相应措施例如,如果您尝试发送一些数据并且数据传输类抛出ConnectionBrokenException
,则可以弹出重新连接对话框并尝试重新连接。然后重新连接方法如果超时则抛出ConnectionTimeoutException
,你可以再次采取适当的行动。
答案 6 :(得分:2)
正如乔尔写道:所以你也可以自己扔掉它们,然后抓住它们并确切地知道它们的含义。
此外,您可以添加有关问题的特定信息,以便让您的异常处理程序更准确地起作用。
答案 7 :(得分:2)
另一个原因,当客户端与接口进行通信时。由于客户端不知道接口的实现,并且因为它们可能会抛出不同的异常,所以它是创建自定义异常以统一抛出错误的好地方。
我写了这个特例:
http://blog.mikecouturier.com/2010/01/creating-custom-exceptions-in-net-right.html
答案 8 :(得分:1)
标准.NET异常并未涵盖任何可能在任何应用程序中出错的内容,也不是它们的目的。除非您的程序非常简单,否则您可能必须至少创建一些自定义异常。
答案 9 :(得分:0)
首先,异常是在库中实现的,而不是在语言中实现 - 它们如何在库中创建异常?我很确定你并不是在提倡系统库应该有一套不同的规则。
另一方面,实际上可以使用异常对象树。如果您愿意,您继承的异常可以具有特殊属性 - 它们可以用于比它们更复杂的事情。我并不主张将它们用作通用数据传输机制或任何东西(虽然它们可能是),但我可以看到有人实现了一个需要特殊属性的自定义日志记录解决方案......
您的自定义异常可能包含一个标记,指示特殊处理(可能有人说您应该重新启动JVM),它们可能包含有关日志记录级别的信息,一堆内容。
无论如何,我不是在提倡这些东西,我只是说这是可能的。第一段是你的真实答案。
答案 10 :(得分:0)
如果内置的Exceptions正确描述了问题/异常,则不应该这样做。我不会创建自己的基类来创建自定义ArgumentException
,ArgumentNullException
或InvalidOperationException
。
您可以创建自己的例外,并在更高级别描述错误。但是,这通常对消费者类的调试没有多大帮助。
如果你自己抛出并捕获异常,可能会有一个自定义异常。