什么时候应该重新抛出异常?

时间:2013-03-07 21:36:51

标签: java exception exception-handling

我有以下代码:

 method1() throws Exception{
 //throws an Exception
 }

 method2() throws Exception{
    method1();
    //do something
 }

 method3() throws Exception{
     method2();
     //do something
 }

 method4() throws Exception{
   try{
       method3();
       //do something
    }catch(Exception e){
       //catch exception
     } 
  }

如果在method1()中发生异常,它会冒泡到method4()并被捕获。

但是,我在一些问题的答案中找到了与此类似的问题,其中以下列方式抛出了异常:

 method1() throws Exception{
   //throws an Exception
 }

 method2() throws Exception{
    try{
       method1();
    }catch(Exception e){
        throw e;
    }
  }

重新抛出异常的最佳方法是什么?为什么它更好?

在我读到的关于“异常处理”最佳实践的文章中,他们说要尽早投入并迟到。这是否意味着我们必须尽可能多地从内部方法中重新抛出异常?

如果我的method1()抛出一个SQLException,我应该只在method4()中捕获它还是在method1()本身处理它?<​​/ p>

更新 比如说,如果在method1()中发生异常,我想在UI中显示一些消息。那么解决方案是什么?我应该冒泡它还是返回一个表明问题的值?

method4()将向UI显示一些消息。

1 个答案:

答案 0 :(得分:1)

使用throw e;抛出异常对我来说似乎不合理。如果您声明了一个封装了一组基本异常的自己的异常类,请使用throw。或者,如果您的程序检测到无效(业务)数据,则不会导致异常。

另外,我会尝试减少方法中throw声明的数量。除了拥有大量异常和try catch块之外,最好使代码对任何类型的异常都更加健壮。明确地将异常一直冒泡(使用throw)会使程序更长,更不易读。

尽可能尝试处理异常;例如如果用户尝试打开非现有文件,则显示警告并返回一个值,该值显示父进程出现故障。

提前退出意味着:您的方法应该尽早验证输入数据并抛出运行时异常,如果某些内容不符合规定。 赶上意味着至少:避免捕获异常,如果您无法做任何事情。让他们相当冒泡并记录或通知用户(取决于系统)

检查ExceptionRuntimeException之间的区别。