我有以下代码:
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显示一些消息。
答案 0 :(得分:1)
使用throw e;
抛出异常对我来说似乎不合理。如果您声明了一个封装了一组基本异常的自己的异常类,请使用throw
。或者,如果您的程序检测到无效(业务)数据,则不会导致异常。
另外,我会尝试减少方法中throw
声明的数量。除了拥有大量异常和try
catch
块之外,最好使代码对任何类型的异常都更加健壮。明确地将异常一直冒泡(使用throw
)会使程序更长,更不易读。
尽可能尝试处理异常;例如如果用户尝试打开非现有文件,则显示警告并返回一个值,该值显示父进程出现故障。
提前退出意味着:您的方法应该尽早验证输入数据并抛出运行时异常,如果某些内容不符合规定。 赶上意味着至少:避免捕获异常,如果您无法做任何事情。让他们相当冒泡并记录或通知用户(取决于系统)
检查Exception
和RuntimeException
之间的区别。