Java程序猿必须懂的一些异常处理指引

我们经常发现好些java程序猿在编码过程中忽略对异常的处理,或者对异常随意胡乱处理或随便抛出去不管不顾,毫无章法,为应用代码的维护和问题的处理挖了很多坑,让后来维护跟进应用的人想直接问候你妈的心都有,下面根据我的一些经验为大家聊聊作为Java程序猿必须要懂的一些异常处理的指引。

一.关于java异常的基础知识

Java异常以Throwable开始,扩展出Error和Exception,而Exception又扩展出RuntimeException等异常,常见异常见下图:

Error是程序代码无法处理的错误,比如OutOfMemoryError、ThreadDeath等。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止退出,其表示程序在运行期间出现了十分严重、不可恢复的错误,应用程序只能中止运行。

Exception分运行时异常和非运行时异常

运行时异常都是RuntimeException类及其子类异常,如NullPointerException、IndexOutOfBoundsException等,这些异常也是不检查异常,程序代码中自行选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序代码应该从逻辑角度尽可能避免这类异常的发生。所有继承Exception且不是RuntimeException的异常都是检查异常,如上图中的IOException和ClassNotFoundException,编译器会对其作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。因此java程序猿重点要关注处理运行时异常,下面一些处理异常指引主要针对它而言。

二.业务异常的通常处理机制(可选,局部异常处理)

1.不想处理或未知的异常一直往外抛直至到最上层集中处理,注意集中处理,处理时必须输出对应的日志。

如:利用Sring mvc支持异常集中处理特性

不想处理或未知的异常从dao->service->controller往上抛,然后在controller统一集中处理,当然可按需集中处理,如不处理统一交给全局异常处理

注意:异常集中处理时不能丢掉或吃掉异常,一定要把异常捕获并后台输出错误日志,但页面上不能输出错误日志,且响应状态码不能设置为200,要按需设置为40x或50x。

2.Jsp页面处理异常

Jsp代码抛出异常并结合errorPage搭配组合使用。如:

新建一个异常接收页面error.jsp,在该页面指定<%@ page isErrorPage="true"%>,然后其他jsp页面的异常处理指向它,<%@ page errorPage="error.jsp"%>

当然可按需处理,如不处理统一给全局异常处理。

注意:error.jsp不能丢掉或吃掉异常,一定要把异常捕获并后台输出错误日志,但页面上不能输出错误日志,且error.jsp的响应状态码不能设置为200,要按需设置为40x或50x。

三.全局异常处理(必须,上面第二步没处理的异常最后统一处理)

通过web.xml配置接收异常的页面


其他http响应状态码按需配置,如400、502、503、504等。

还可按指定异常配置接收异常页面,如:


注意:此异常接收处理页面不能用静态页必须是动态页,且不能丢掉或吃掉异常,一定要把异常捕获并后台输出错误日志,但页面上不能输出错误日志,且异常接收页面的响应状态码不能设置为200,要按需设置为40x或50x。

以上第二和第三部分互为一体,有些异常需要局部处理的按需处理。

三.一些必须及时捕获处理异常的场景

1.用多线程实现的定时任务在循环处理数据时出现异常必须及时处理,否则执行时会退出。

2.页面豆腐块接口或供外接口必须处理异常,如出现异常返回空字符串或其他指定格式的信息提示返回。

3.ajax异步调用的接口必须处理异常,如出现异常返回空字符串或其他指定格式的信息提示返回。

四.一些关于处理异常的重要原则

1.捕获异常是为了处理它,捕获异常后吃掉不作任何处理是毫无节操无人品的耍流氓,至少要输出简单的错误日志提示,如果不想处理它,请将该异常抛给它的调用者。

捕获异常后不处理的代码示例:

try{

Do something;

}catch(Exeception e){

//此处无任何代码处理异常,挖坑作死的节奏!

}

2.异常不要用来做流程或条件控制,因为异常的处理效率比较低。

3.防止出现空指针异常是程序员的基本修养,注意该异常产生的场景。

4.当方法判断出错该返回时应该抛出异常,该抛异常就得抛,而不是返回一些错误值,如返回-1 或者 -2 之类的错误值。

5.如需处理处理异常,其处理的粒度不能太粗,如几百行代码放到一个try-catch 块中处理,应该一个一个异常放在各自的try-catch 块中处理。

6.对于一个应用来说,应该要有自己的一套整体的异常处理机制,当各种异常发生时能得到相应统一的处理风格,将友好的异常信息反馈给用户。


文/阿青,写代码写诗写职场的程序猿大叔,倾力原创简单实用的硬干货,转载此文请联系阿青。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 六种异常处理的陋习 你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代...
    Executing阅读 1,313评论 0 6
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,556评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 转载文章,仅用于个人查阅和学习。原文链接:http://www.jianshu.com/p/15872cba211...
    Jayden_Cao阅读 1,230评论 0 1
  • 今天我不自觉的走到儿子的书柜前,随意翻着,当翻到一本中国寓言故事时,我拿在手上,这是儿子上小学一年级时买的...
    赵飞扬妈妈阅读 141评论 0 1