有关于异常捕获点滴,plus我也揭揭java的短
2017-12-28 20:09
375 查看
先如下代码:
@Test public void testException1() { System.out.println("begin..."); int[] arr = new int[]{1}; System.out.println(arr[1]); }
执行结果:
java.lang.ArrayIndexOutOfBoundsException: 1 at com.emax.paycenter.web.controller.PayCenterAgentPayAPITest.testException1(PayCenterAgentPayAPITest.java:5)
异常是从第5行抛出来的,控制台里显示的异常堆栈信息也是始于第5行。
我们在写程序时往往要捕获异常。如下是画蛇添足型:
@Test public void testException() { try { System.out.println("begin..."); int[] arr = new int[]{1}; System.out.println(arr[1]); } catch (Exception ex) { throw ex; } }
很明显,捕获了异常,却只是throw出去,没任何意义!
如下try...finally是不是也有些奇葩?
public void testTryFinally() { try { System.out.println("begin..."); int[] arr = new int[]{1}; System.out.println(arr[1]); }finally { System.out.println("over"); } }
看似优雅,可是你也没捕获异常呀!
如下处理方式也不可取:
@Test public void testException() { try { System.out.println("begin..."); int[] arr = new int[]{1}; System.out.println(arr[1]); } catch (Exception ex) { throw new MyException( ex.getMessage() ); } }
异常的堆栈始于抛出异常的代码行。catch里经过这样中转后,导致堆栈信息的显示的行号不再是6,而是8。尤其当代码逻辑复杂时,这样做无意增加了排障的难度。
当然,我们有时要在系统里通过自定义异常类型,实现我们所需的逻辑控制(自定义异常是个好东西哦,《代码整洁之道》一书中多次提到使用异常来替代错误码)。如果真要通过MyExecption中转出去,可在throw之前将完整的异常信息记录到日志文件里。
类似如下代码是不是很熟悉?
public int myBiz() { int result; try { System.out.println("begin..."); int[] arr = new int[]{1}; result = arr[1]; return result; } catch (Exception e) { return 0; } }
私自吞异常是要犯法的哦~~
哈哈,去翻翻自己写的代码吧~
ExceptionUtils记录异常
.net程序员都知道,记录一个异常信息时,直接ex.ToString()就可以了。如果在java里,你还这样,那就out了。查看一下Exception的基类——Throwable的toString()方法,可知,ex.ToString()返回的是异常类型和message。
这时,要打印完整的日志信息,apache commons-lang3包里的ExceptionUtils可要派上用场了。 没错,用ExceptionUtils.getStackTrace(final Throwable throwable)
揭短ExceptionUtils
有些异常并没有root cause的,此时,调用ExceptionUtils的getRootCause(final Throwable throwable)返回值是null,而你调用其getRootCauseMessage(final Throwable th)时,反而有返回值。 查看getRootCauseMessage的代码实现,发现它做了二元判断,如果root cause是null,它就去取th本身的message。 前者返回null,后者有返回值,自我赶脚有些费解!whataboutu?//public class ExceptionUtils { public static Throwable getRootCause(final Throwable throwable) { final List<Throwable> list = getThrowableList(throwable); return list.size() < 2 ? null : (Throwable)list.get(list.size() - 1); } public static String getRootCauseMessage(final Throwable th) { Throwable root = ExceptionUtils.getRootCause(th); root = root == null ? th : root; return getMessage(root); }
相关文章推荐
- 【java解惑】关于异常捕获的三条要求
- 无法捕获异常:Java关于在catch中抛出一个异常给外围函数却捕获不到该异常的思考
- 关于存储过程和函数异常出现和JAVA捕获简单处理方案
- 【java解惑】关于异常捕获的三条要求
- 关于Java的异常捕获
- Java经验点滴:处理没有被捕获的异常
- Java经验点滴:处理没有被捕获的异常
- Java 理论与实践: 关于异常的争论
- JAVA 线程中的异常捕获
- Java中关于异常的一些问题(三)
- 【ThinkingInJava】24、捕获一个异常之后抛出另外一个异常,并且希望吧原始的信息保存下来
- 关于 java.lang.InstantiationException 异常
- java关于类不存在和方法不存在的异常问题
- Java -- 异常的捕获及处理 -- 异常类的继承结构
- 关于OKhttp的异常:java.net.ProtocolException: expected 6137 bytes but received 7081
- 关于利用动态代理手写数据库连接池的异常 java.lang.ClassCastException: com.sun.proxy.$Proxy0 cannot be cast to java.sql.Connection
- 关于java处理异常的话题
- 关于JAVA异常总结
- 关于struts2+hibernate3.2中出现的java.lang.ClassCastException: java.lang.Integer异常的解决方案
- [转]java异常中Exception捕获不到的异常