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

时间:2009-01-31 04:06:43

标签: java exception throwable

鉴于:ThrowableException的超类。

当我阅读有关编写您自己的“例外”的文字时,我会看到Throwable块中使用catch的示例以及{{1}中使用的其他文字显示new Exception()阻止。我还没有看到解释何时应该使用每一个。

我的问题是,何时应该使用catch以及何时应该使用Throwable

new Exception()catch区域内使用:

else

throw throwable;

12 个答案:

答案 0 :(得分:37)

始终抛出Exception(绝不是Throwable)。你通常也不会抓住Throwable,但你可以。 Throwable是ExceptionError的超类,所以如果你不仅要抓住Throwable而不是Exception s,那么你会抓住Error,这就是重点拥有它。问题是,Error s通常是普通应用程序不会也不应该捕获的内容,因此除非您有特定原因要使用Exception,否则请使用Throwable

答案 1 :(得分:13)

  

(来自评论)带来这个问题的是这个问题   我需要将一个“例外”传递给一个   一位同事正在建造的一段代码   如果集合没有建成。

在这种情况下,您可能希望抛出已检查的异常。你可以抛出一个Exception,它的一个适当的现有子类(除了RuntimeException及其未选中的子类),或者Exception的自定义子类(例如“CollectionBuildException”)。请参阅Java Tutorial on Exceptions以快速了解Java异常。

答案 2 :(得分:7)

你不应该真正捕捉到异常并抛出一个新的异常“new 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
}

我认为,捕获异常并抛出一个新的异常而不是引发给你的代码块的异常是不好的做法,除非你提出一个有用的自定义异常,提供足够的上下文以避免导致最初的例外。

答案 3 :(得分:5)

只有两个地方你应该在代码中看到单词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
         }
      }
 }

答案 4 :(得分:1)

Throwable是一个接口,而不是一个类。两个类扩展了Throwable,Exception和Error。

规则是:在捕获异常时尽可能具体 - 这意味着例如捕获Exception而不是Throwable,以及IOException而不是Exception。

不要捕获错误 - 错误是错误。改为修改代码。

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

答案 5 :(得分:1)

throw new Exception();是你应该永远在catch块中执行的操作,但是您可能必须或者想要抛出new SomeException(throwable);(保留完整的堆栈跟踪)而不是throw throwable;以符合您方法的API,例如当它声明抛出SomeException但你正在调用可能抛出IOException的代码时,你不想添加到方法的throws子句中。

可能最常见的情况是new RuntimeException(throwable);,以避免完全使用throws条款。许多人会告诉你这是一个可怕的滥用,因为你应该使用检查异常。 IMO他们错了,检查异常是Java语言设计中的一个错误,只会导致丑陋,不可维护的代码。

答案 6 :(得分:0)

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

所以只需捕获异常(或者更好的是,更细粒度的异常)。

答案 7 :(得分:0)

Throwable只能由程序的容器或主循环捕获。大多数时候捕获Exception以下的内容,例如Error不会为程序添加太多功能,毕竟如果抛出VirtualError其他错误,你可以做什么。除了log和continue之外没什么了。

答案 8 :(得分:0)

所有异常最终都是一个问题...也就是说错误是错误并不意味着什么。

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

答案 9 :(得分:0)

一般情况下,你不会抛出或抓住Throwable。特别是,除非您正在进行奇怪的系统级工作,否则JVM错误(扩展Error())不会被意味着被用户代码捕获。

将“Throwable”视为语言工件。 “异常”类的名称是因为它是程序员在希望代码块“异常”退出时使用的类 - 通过不正常退出或返回值。

这包括常规错误情况(通过“常规”表示与JVM错误相反)以及将异常用作控制机制的位置。

答案 10 :(得分:0)

你不应该使用Exceptions作为“返回类型”...

如果您投掷的条件很常见,那么您将花费大量资源将该条件返回到调用例程。构建例外的代价很高。

我见过一些情况,其中紧急循环将异常作为“负面”,例如ID分配,这个例程占用了大约99%的CPU时间..当改为记录的返回常量时,这个下降到25%。

答案 11 :(得分:0)

Oracle在its official tutorial ("How to Throw Exceptions")中给出了答案。

首先,它说明Throwables Error Exception 类的并集,它们是 2个不同的类事物

Throwable = Error + Exception

接下来,很明显, Error 非常罕见,几乎无法从恢复。

  

当Java中发生动态链接失败或其他硬性故障时   虚拟机发生时,虚拟机将引发错误。

将1 + 1放在一起,就会有礼貌地得出结论,(简单的Exception除外)没有任何捕捉力 Throwable ,因为您对此无能为力。

  

简单的程序通常不会捕获或引发错误。