当应Throwable的使用,而不是新的异常?
题
给定:Throwable
是Exception
的超类
当我读了写自己的“例外”的文本,我看到Throwable
块正在使用catch
的例子和其他文本显示new Exception()
在catch
块被使用。我还没有看到的,当一个应该使用每个的说明。
我的问题是,当应Throwable
使用,并且当应该new Exception()
使用?
内使用catch
或else
块之一:
throw throwable;
或
throw new Exception();
解决方案
(从评论)是提出这是问题 我需要传递一个“例外”的 一段代码同事正在建设 如果收集没有得到建。
在这种情况下,你可能要抛出的 checked异常的。你可以抛出一个 Exception
,适当的现有它(子类除了 RuntimeException
和它的子类其是选中),或Exception
的定制子类(例如, “CollectionBuildException
”)。见 Java教程中的例外,,以加快速度用Java异常。
其他提示
始终抛出Exception
(从未一个Throwable
)。你通常不抓Throwable
下去,但你可以。 Throwable的是Exception
和Error
超类,所以你会赶上Throwable
如果你想不仅赶上Exception
s但Error
s,这就是点有它。问题是,Error
s一般是东西正常的应用程序会也不应该赶上,所以只需使用Exception
除非你有特别原因需要使用Throwable
。
您真的不应该捕捉异常,并抛出一个新的一般为“新的异常”。
相反,如果你想泡了异常只是做了以下内容:
try {
// Do some stuff here
}
catch (DivideByZeroException e) {
System.out.println("Can't divide by Zero!");
}
catch (IndexOutOfRangeException e) {
// catch the exception
System.out.println("No matching element found.");
}
catch (Throwable e) {
throw e; // rethrow the exception/error that occurred
}
这是不好的做法,我相信,捕捉异常,并抛出一个新的异常,而不是说提高到您的代码块中的一个,除非你提出一个有用的自定义异常,可提供足够的上下文来躲避到事业原始异常。
只有两个地方,你应该看到在代码中字Throwable
:
public static void main(String args[])
{
try
{
// Do some stuff
}
catch(Throwable t)
{
}
}
和
public class SomeServlet extends HttpServlet
{
public void doPost(HttpRequest request, HttpResponse response)
{
try
{
// Do some stuff
}
catch (Throwable t)
{
// Log
}
}
}
<击> Throwable的是一个接口,不是类。击>两类延伸的Throwable,异常和错误。
规则是:越具体可以捕捉异常时 - 这意味着例如捕捉代替Throwable异常,以及代替IOException异常的异常
。不要捕捉错误 - 错误的bug。修复代码代替。
如果你必须赶上绝对一切,用“赶Throwable的”,但是这是不好的形式。
throw new Exception();
是你应该的从不的做一个catch块,但您可能需要或想要做抛new SomeException(throwable);
(保留完整的堆栈跟踪),而不是throw throwable;
为了符合API你的方法,例如当它宣布扔SomeException
但你调用代码可能抛出,你不希望添加到您的方法的IOException
子句的throws
。
在可能最常见的情况是new RuntimeException(throwable);
完全避免具有throws
子句。很多人会告诉你,这是一个可怕的虐待,因为你应该使用checked异常。 IMO他们是错误的,并检查异常是在Java语言设计,只是导致难看,不可维护的代码错误。
当我听到它时,Java的第一次出来,这个理论是Throwable的可能被用于控制在其他情况下,除了转让例外。我从来没有见过它用这种方式虽然(这可能是一个非常好的事情)。
所以只捕获的异常(或更好的是,一个更细粒度的除外)。
的Throwable是指由容器或程序的主循环仅捕获。大部分时间捕捉低于异常如错误的东西不会增加太多的能力来计划,毕竟有什么可以做的可能,如果VirtualError其他错误抛出。除了日志没有太大并继续。
所有的例外是在最后一个问题......太说,错误是错误并不意味着什么。
错误是不是错误 - 它们是主机VM正在经历的问题,例如OutOfMemoryError异常。例外的是,当前的操作可使用以通知它失败,也许提供一些诊断的装置。
一般情况下,你就不会抛出或捕获Throwable。特别是,JVM错误(即延长错误())不的意味着的由用户代码,除非你正在做奇怪的系统级工作被抓住。
治疗“的Throwable”作为语言伪影。该“异常”类被命名的,因为它是旨在由程序员使用时,他们想的码块以退出“特别”的一个 - 由不正常退出或返回一个值
这既包括常规错误的情况下(通过“常规”我的意思,而不是JVM错误)和地方,你正在使用异常作为一种控制机制。
您不应该使用异常的“返回类型”要么...
如果你把自己的情况很常见,你花费了大量的资源,以该条件返回到调用程序。例外的是,构建昂贵。
我看到的情况下紧密循环抛出异常为“负”为例如ID分配,当改变为记录返回恒定代替该例程所占据约99%的CPU时间..,这下降了25%。