Java异常处理的十个建议

1.尽量使用log打印

printStackTrace()打印的堆栈信息和业务代码是混合在一起的,排查起来不太方便
e.printStackTrace()会产生字符串,占用字符串常量池空间

2.没有打印出具体的Exception,无法更好定位问题

log.info(“程序出现异常”,e);
打印异常信息有利于排查问题

3.不要用一个Exception捕捉所有可能的异常

如果用基类 Exception 捕捉多个可能的异常,会丢失原始异常的有效信息

	try{
        // IOException 的代码调用
        // SQLException 的代码调用
    }catch(IOException e){
        log.info(“IOException:, e);
    }catch(SQLException e){
        log.info(“SQLException:, e);
    }

4.使用finally关闭流资源或者直接使用try-with-resource

如果程序发生异常,资源流未关闭,就会被一直占用,造成资源浪费
JDK7的新特性try-with-resource来处理,用于自动资源管理。
—资源是指在程序用完了之后必须要关闭的对象。
—try-with-resources保证了每个声明了的资源在语句结束的时候会被关闭
—只要实现了java.lang.AutoCloseable接口或者java.io.Closeable接口的对象,都可以视为资源。

FileInputStream fis = null;
try {
    fis = new FileInputStream(new File("test.txt"));
} catch (FileNotFoundException e) {
    log.error(e);
} catch (IOException e) {
    log.error(e);
}finally {
    try {
        if (fis != null) {
            fis .close();
        }
    } catch (IOException e) {
        log.error(e);
    }
}
try (FileInputStream inputStream = new FileInputStream(new File("test.txt")) {
//-----------------------
} catch (FileNotFoundException e) {
    log.error(e);
} catch (IOException e) {
    log.error(e);
}

5.捕获异常与抛出异常必须是完全匹配,或者捕获异常是抛异常的父类

//抛出Exception的子类
public static void test() throws BizException {}
try {
    test();
} catch (Exception e) {
    log.error(e);
}

6.捕获到的异常,至少打点日志

7.注意异常对你的代码层次结构的侵染(早发现早处理)

我们的项目一般分为不同的层次结构,如果是SQL异常,尽早处理吧,如果往上 throw SQLException,上层代码还是要try catch处理,可能会与业务逻辑混杂在一起,这就污染了你的代码

8.自定义封装异常,不要丢弃原始异常的信息Throwable cause

catch (FileNotFoundException e) {
//e 保存异常信息
throw new MyException(“文件在哪里呢”, e);
}

9.运行时异常RuntimeException ,不应该通过catch 的方式来处理,而是先预检查,比如:NullPointerException处理

if (object != null){

}

10.注意异常匹配的顺序,优先捕获具体的异常

只有第一个匹配到异常的catch块才会被执行。如果你希望看到,是NumberFormatException异常,就抛出NumberFormatException,如果是IllegalArgumentException就抛出IllegalArgumentException。
把优先需要匹配的异常置于最前

try {
    //-----------------------
} catch (NumberFormatException e) {       
    log.error(e);
} catch (IllegalArgumentException e) {
    log.error(e);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值