什么时候应该使用Throwable而不是新的Exception?

鉴于:Throwable是Exception的超类。

当我在编写自己的“exception”时读取文本时,会看到在catch块中使用Throwable示例,其他文本显示在catch块中使用new Exception() 。 我还没有看到什么时候应该使用的解释。

我的问题是,什么时候应该使用Throwable ,什么时候应该使用new Exception()

编辑:在catchelse块使用:

 throw throwable; 

要么

 throw new Exception(); 

(来自评论)带来这个问题的是,如果一个集合没有被构build,我需要传递一个“exception”到同事正在构build的一段代码。

在这种情况下,你可能想要抛出一个检查的exception 。 你可以抛出一个Exception ,一个合适的现有子类( RuntimeException及其未被选中的子类除外)或一个Exception的自定义子类(例如“ CollectionBuildException ”)。 请参阅“ 例外Java教程”以加快Java例外。

总是抛出一个exception(从来没有一个Throwable)。 你一般也不会接受Throwable,但你可以。 Throwable是Exception和Error的超类,所以如果你不想只捕获exception而错误,那么你就可以捕获Throwable。 事情是,错误通常是一个正常的应用程序不会和不应该捕获的东西,所以只要使用exception,除非你有一个特定的理由使用Throwable。

你不应该真的抓到一个exception,像“新的exception”一样抛出一个新的exception。

相反,如果您希望冒出exception,请执行以下操作:

 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 } 

我相信这不是一个很好的做法,可以捕获一个exception并抛出一个新的exception,而不是引发到您的代码块的exception,除非您提出了一个有用的自定义exception,以提供足够的上下文来避免原始exception。

只有两个地方你应该看到代码中的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,Exception和Error。

规则是:在捕获exception时尽可能具体 – 这意味着例如捕获Exception而不是Throwable,而IOException不是Exception。

不要错误 – 错误是错误。 修改代码。

如果你必须抓住所有的东西,使用“抓Throwable”,但这是不好的forms。

throw new Exception(); 是你不应该在catch块中做的事情,但是你可能要或者想要抛出new SomeException(throwable); (保留完整的堆栈跟踪),而不是throw throwable; 为了符合你的方法的API,例如,当它声明抛出SomeException但你调用的代码可能会抛出一个IOException ,你不想添加到你的方法的throws子句。

可能最常见的情况是new RuntimeException(throwable); 避免有一个throws子句完全。 许多人会告诉你这是一个可怕的滥用,因为你应该使用检查exception。 国际海事组织他们是错误的,检查exception是Java语言devise中的一个错误,只是导致丑陋,不可维护的代码。

正如我在Java第一次出现时所听到的那样,理论上Throwable可能被用于除了exception之外的其他情况下的控制转移。 我从来没有见过这种方式(这可能是一件很好的事情)。

所以,只要抓住exception(或更好,但更细粒度的例外)。

Throwable只能被程序的容器或主循环捕获。 大多数情况下,捕获Exception(例如Error)之下的东西并不会增加程序的function,毕竟如果引发VirtualError其他错误,您可能会做什么。 除了日志和继续,没有多less。

所有的exception最终都是一个问题…也是说错误是错误并不意味着什么。

错误不是错误 – 它们是主机VM遇到的问题,例如OutOfMemoryError。 例外是当前操作可能用于通知它失败并可能提供一些诊断的手段。

一般来说,你不会扔或捕获Throwable。 尤其是,JVM错误(扩展了Error())并不意味着被用户代码捕获,除非你做了奇怪的系统级工作。

将“Throwable”视为语言工件。 “Exception”类被命名,因为它是当程序员希望代码块“exception地”退出时(通过不正常退出或返回值)而被使用的类。

这包括常规的错误情况(通过“常规”我的意思是与JVM错误相反)以及您将exception用作控制机制的地方。

您不应该使用例外作为“返回types”…

如果你投掷的条件是常见的,你正在花费大量的资源将这个条件返回到调用例程。 exception构build昂贵。

我已经看到了例外的情况,例如ID分配的exception作为“负面”,这个例程占用了大约99%的CPU时间。当改为logging的返回常量时,这个比例下降到了25%。