有关于异常捕获点滴,plus我也揭揭java的短
▄︻┻┳═一『异常捕获系列』Agenda:
▄︻┻┳═一有关于异常捕获点滴,plus我也揭揭java的短
▄︻┻┳═一根据异常自定义处理逻辑(【附】java异常处理规范)
▄︻┻┳═一利用自定义异常来重构代码
先如下代码:
@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);
}
有关于异常捕获点滴,plus我也揭揭java的短的更多相关文章
- 异常捕获 UncaughtExceptionHandler MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android全局异常捕获
PS:本文摘抄自<Android高级进阶>,仅供学习使用 Java API提供了一个全局异常捕获处理器,Android引用在Java层捕获Crash依赖的就是Thread.Uncaught ...
- .NET 基础 一步步 一幕幕[数组、集合、异常捕获]
数组.集合.异常捕获 数组: 一次性存储多个相同类型的变量. 一维数组: 语法: 数组类型[] 数组名=new 数组类型[数组长度]; 声明数组的语法: A.数据类型 [] 数组名称= new 数据类 ...
- MVC 好记星不如烂笔头之 ---> 全局异常捕获以及ACTION捕获
public class BaseController : Controller { /// <summary> /// Called after the action method is ...
- atitit.js浏览器环境下的全局异常捕获
atitit.js浏览器环境下的全局异常捕获 window.onerror = function(errorMessage, scriptURI, lineNumber) { var s= JSON. ...
- C#中的那些全局异常捕获
1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异 ...
- Spring-MVC开发之全局异常捕获全面解读
异常,异常 我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个! 产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息! 在用Spring MVC开发WEB应用时捕获全局异常的方法基本有 ...
- JavaScript异常捕获
理论准备 ★ 异常捕获 △ 异常:当JavaScript引擎执行JavaScript代码时,发生了错误,导致程序停止运行: △ 异常抛出:当异常产生,并且这个异常生成一个错误信息: △ 异常捕获: ...
- SQLServer异常捕获
在SQLserver数据库中,如果有很多存储过程的时候,我们会使用动态SQL进行存储过程调用存储过程,这时候,很可能在某个环节就出错了,但是出错了我们很难去跟踪到出错的存储过程,此时我们就可以使用异常 ...
随机推荐
- okvis代码解读
okvis_timing模块 提供时间转换的功能函数 okvis_util模块 包含 assert_macros.hpp 该文件包含一些有用的断言宏. source_file_pos.hpp 该文件 ...
- POJ 1102 - LC-Display
Description A friend of you has just bought a new computer. Until now, the most powerful computer he ...
- [No000016E]Spring 中获取 request 的几种方法,及其线程安全性分析
前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...
- [No0000131]WCF压缩传输方案整理
1.WCF进阶:将编码后的字节流压缩传输 2.通过WCF扩展实现消息压缩 3.WCF 消息压缩性能问题及解决方法
- json序列化以及反序列化存在多个对象时候的处理
存在多个对象的时候,只需要将反序列化存在的对象,遍历出来即可. using System;using System.Collections.Generic;using System.Linq;usin ...
- Flink – metrics V1.2
WebRuntimeMonitor .GET("/jobs/:jobid/vertices/:vertexid/metrics", handler(new JobVertexM ...
- Mysql undo redo 总结
- 《HTTP - http报文》
还时推荐一首歌 - 那吾克热<纸飞机> 有没有突然想要个孩子的冲动,哈哈. 读 第三章<HTTP报文内的HTTP信息> 总结 1:用于HTTP协议交互叫做HTTP报文,请求端( ...
- Django 正向解析与反向解析
正向解析就是按照顺序查找访问(urls.py---view--templates) 反向解析就是根据命名空间命名来调到指定的页面 用反向解析的原因: 随着功能的增加会出现更多的视图,可能之前配置的正则 ...
- java怎么实现统计一个字符串中字符出现的次数
问题:假设字符串仅仅保护a-z 的字母,java怎么实现统计一个字符串中字符出现的次数?而且,如果压缩后的字符数不小于原始字符数,则返回. 处理逻辑:首先拆分字符串,以拆分出的字符为key,以字符出现 ...
