给定:ThrowableException的超类

当我读了写自己的“例外”的文本,我看到Throwable块正在使用catch的例子和其他文本显示new Exception()catch块被使用。我还没有看到的,当一个应该使用每个的说明。

我的问题是,当应Throwable使用,并且当应该new Exception()使用?

内使用catchelse块之一:

throw throwable;

throw new Exception();
有帮助吗?

解决方案

  

(从评论)是提出这是问题   我需要传递一个“例外”的   一段代码同事正在建设   如果收集没有得到建。

在这种情况下,你可能要抛出的 checked异常的。你可以抛出一个 Exception ,适当的现有它(子类除了 RuntimeException 和它的子类其是选中),或Exception的定制子类(例如, “CollectionBuildException”)。见 Java教程中的例外,,以加快速度用Java异常。

其他提示

始终抛出Exception(从未一个Throwable)。你通常不抓Throwable下去,但你可以。 Throwable的是ExceptionError超类,所以你会赶上Throwable如果你想不仅赶上Exceptions但Errors,这就是点有它。问题是,Errors一般是东西正常的应用程序会也不应该赶上,所以只需使用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%。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top