【Exception】Java 异常处理基本规则,Java异常处理的基本规范

soゝso 2017-09-13 18:27:11 6737

看了团队中原来代码中的异常处理,心碎了一地,稍微对照阿里巴巴的异常处理规范整理了一遍,准备分享一下,Java的异常处理规范&约束。

一、运行异常的扑捉

不要捕获   Java  类库中定义的继承自 RuntimeException 的运行时异常类,如:IndexOutOfBoundsException / NullPointerException ,这类异常由程序员预检查来规避,保证程序健壮性。

正例:

if(null != obj) {
    //TODO
}

反例:

try {
    obj.method()
} catch(NullPointerException e){
   //TODO
}

二、 try-catch 作用域(现有代码出现率较高)

对大段代码进行try-catch ,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理。
正例:
分块catch ,或者直接抛出相对应的异常,然后由下层细化处理。

map.put("status", 500);   
try{
    //代码省略
    map.put("message", "success!");   
    map.put("status", 200);   
} catch (UnknownHostException e) {
    //域名错误
    map.put("message", "请输入正确的网址");
    LoggerUtils.fmtError(e, "网址异常[%s]", url);
} catch (SocketTimeoutException e) {
    //超时
    map.put("message", "请求地址超时");
    LoggerUtils.fmtError(e, "请求地址超时[%s]", url);
 
} catch (Exception e) {
    //其他异常
    map.put("message", "请求出现未知异常,请重试!\r\n" + e.getMessage());
    LoggerUtils.fmtError(e, "请求出现未知异常,请重试![%s]", url);
}
return map;

反例:

try {
   //此处省略1024行代码
} catch(Exception e){
   //TODO
}

三、异常的捕捉 & 异常的处理(现有代码出现率较高)

捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容。

正例:

try{
    //代码省略
} catch (UnknownHostException e) {
    //域名错误
    map.put("message", "请输入正确的网址");
    LoggerUtils.fmtError(XXXXManager.class, e, "网址异常[%s]", url);
} catch (SocketTimeoutException e) {
    //超时
    map.put("message", "请求地址超时");
    LoggerUtils.fmtError(XXXXManager.class, e, "请求地址超时[%s]", url);
 
} catch (Exception e) {
    //其他异常
    map.put("message", "请求出现未知异常,请重试!\r\n" + e.getMessage());
    LoggerUtils.fmtError(XXXXManager.class, e, "请求出现未知异常,请重试![%s]", url);
}

只为描述一下异常,继续抛出。

try{
    //代码省略
} catch (UnknownHostException e) {
    throw new HNException("xxx处理失败。",e);
}

反例:

1.如下,调用者对异常没有任何感知。

try{
    //代码省略
} catch (Exception e) {
    System.out.println("插入异常");
}

2.如下,调用者对异常无法定位和判断

try{
    //代码省略
} catch (UnknownHostException e) {
    throw new RuntimeException("500");
}

四、异常 & 事务

  1. try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务。
  2. 在有事务的代码中,catch 异常后,做描述异常等处理后,如果需要事务生效,请把异常继续抛出。

五、异常 & finally

1.如果有对IO 流和资源做操作,必须逐一关闭IO 流和资源对象(从里层到外层),有异常也要做处理。

try{
    //代码省略
} catch (Exception e) {
    throw new HNException("xxx处理失败。",e);
 
}finally{
             
    try {
        if(null != conn){
            conn.disconnect();
        }
    } catch (Exception e1) {
        LoggerUtils.fmtInfo("请求完毕关闭流出现异常![%s]", url);
    }
    try {
        if(null != outStream){
            outStream.close();
        }
    } catch (Exception e2) {
        LoggerUtils.fmtInfo("请求完毕关闭流出现异常![%s]", url);
    }
    try {
        if(null != out){
            out.close();
        }
    } catch (Exception e3) {
        LoggerUtils.fmtInfo("请求完毕关闭流出现异常![%s]", url);
    }
             
}

  JDK  7 以上可以使用try-with-resources 方式。

六、finally &  return

不能在 finally 块中使用 return finally 块中的 return 返回后方法结束执行,不会再执行 try 块中的 return 语句。

七、异常需要精确

捕获异常与抛异常,必须是完全匹配,或者捕获异常是抛异常的父类。如果预期对方抛的是绣球,实际接到的是铅球,就会产生意外情况。

八、程序员的基本修养 & NPE(现有代码中出现率较高)

1.方法(接口)的返回值可以为 null ,但不推荐返回空集合,或者空对象等,必须添加注释充分说明什么情况下会返回 null 值。调用方需要进行 null 判断防止 NPE 问题。

2. 防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景。

    a.查询数据库返回null ,包括null 对象和null 集合。

    b.集合内元素有null 对象。




版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/251.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root.
jQuery Jsonp 请求,捕获异常(404,50X)状态异常
Javascript 生成UUID,Java生成UUID
Shiro 教程,关于最近反应的相关异常问题,解决方法合集。
Java Cookie 操作工具类
Java 文字转图片输出,Java 输出透明背景图片,Java文字转图片防爬虫
Java获取域名,Java从URL地址中获取域名,Java从Request 获取域名
Http Get 请求,Java 请求工具类封装
Java对文件CRC32值计算
Java服务端监控平台设计
最新文章
使用七牛云存储实现图片API,自动删除图片方案合集 372
神速ICP备案经验分享,ICP备案居然一天就通过了 1607
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 2648
SOJSON 拓展服务器被DDos攻击了一晚上,是如何解决的? 2865
湖南地区备案“新增网站需提交组网方案或解释说明”,关于备案做简单叙述 2803
企查查你是个什么企业,骗子的帮凶,诈骗的集中营,通过企查查骚扰企业电话不断,为所欲为的企查查 8845
Java爬取百度云观测对网站的检测数据,获取子域名及域名的安全信息 2351
【2020年】百度搜索词获取,获取百度搜索的关键词【真实有效】 6254
Nodejs环境安装,Nodejs环境安装一篇就够了 1609
iOS版淘宝打开提示“您使用的程序是内测版本,将于2020-03-28到期,到期将无法使用,请尽快下载最新版本” 2388
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 422860
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 413913
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 346874
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 298331
免费天气API,天气JSON API,不限次数获取十五天的天气预报 278330
Elasticsearch教程(四) elasticsearch head 插件安装和使用 216098
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 167659
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 133638
Elasticsearch教程(一),全程直播(小白级别) 117007
Elasticsearch教程(五) elasticsearch Mapping的创建 97439

骚码加入我们 / 千人QQ群:259217951

入群需要5元为的是没有垃圾广告,如果没有QQ钱包,可以加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...