当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《什么时候应该使用Throwable而不是新的Exception?》经验,为你挑选了4个好方法。

鉴于:ThrowableException超级.

当我编写自己的"例外"读课文,我看到的例子Throwable中所使用catch的块和其他经文显示new Exception() 在正在使用catch块.我还没有看到何时应该使用每个的解释.

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

使用以下任一内部catchelse块内:

throw throwable;

要么

throw new Exception();

Ray Hidayat.. 38

总是抛出Exception(永远不会Throwable).你通常也不会抓到Throwable,但你可以.Throwable的是超类中ExceptionError,所以你会赶上Throwable如果你想不仅捕捉Exception秒,但ErrorS,这就是点有它.事情是,Errors通常是普通应用程序不会也不应该捕获的东西,所以只要使用,Exception除非您有特定的理由使用Throwable.



1> Ray Hidayat..:

总是抛出Exception(永远不会Throwable).你通常也不会抓到Throwable,但你可以.Throwable的是超类中ExceptionError,所以你会赶上Throwable如果你想不仅捕捉Exception秒,但ErrorS,这就是点有它.事情是,Errors通常是普通应用程序不会也不应该捕获的东西,所以只要使用,Exception除非您有特定的理由使用Throwable.


不要抛出异常,抛出相应的Exception子类或您自己的.具有子类的Exception的重点是不同类型的问题可以有自己的例外.除了包含消息并可能包装原因异常之外,还可以添加额外的"数据".

2> Zach Scriven..:

(来自评论)提出这个问题的一个问题是,如果集合没有构建,我需要将一个"例外"传递给同事正在构建的一段代码.

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


我喜欢你如何完全避免问题的核心方面:在抛出异常时是否使用throwable或exception作为基础.我也喜欢提问者接受它作为正确的答案.
Throwable是Exception和Error的超类.在这三个类中,我认为Exception是最适合该任务的类.大多数人编写的try-catch块只能查看Exception及其子类; 他们将无法处理新的Throwable().

3> MichaelD..:

您不应该真正捕获异常并抛出一个新的常规"新异常".

相反,如果您想冒泡出现异常,请执行以下操作:

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
}

我相信,捕获异常并抛出一个新的异常而不是引发到代码块的异常是不好的做法,除非你提出一个有用的自定义异常,提供足够的上下文来避免原始异常的原因.


此代码将丢弃DivideByZero和IndexOutOfRange异常.在抛出异常之前记录异常通常是一个坏主意.如果根本记录了异常,通常最好在堆栈中负责真正处理错误的级别执行,而不重新抛出.
该代码旨在解决提问者的问题.不影响提问者问题的最佳做法超出了他的答案范围.我只想表明您可以解决异常情况,但如果发生异常异常仍然会重新抛出异常.

4> 小智..:

只有两个地方你应该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
         }
      }
 }


即使这两个人至少会有一个太多,IMO.捕捉'Throwable`(特别是在'main`之外)是灾难的一个方法,因为你的网络太宽了.不只是应用程序级别的异常是Throwable.常见示例:OOM错误.如果编写日志的行为导致创建对象(读取:由刚刚失败的进程分配),您将如何记录它们?当*失败时,现在怎么办?您丢失了导致原始错误的信息,因为您已经导致了一个新的错误传播.如果应用程序不仅仅会死亡,那就是这样.
推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有