异常处理tips

1.场景描述

项目中,有遇到这种异常场景:在一个循环中,某一次出现了异常,但是希望程序捕获异常处理后,继续执行下去。

这种怎么处理呢?

2.处理方式

2.1错误方式

try-catch包裹住整个循环:

@Test
public void testException1() {
    try {
        for (int i = 0; i < 15; i++) {
            // i = 10时,制造一个算术异常
            if (i == 10) {
                int j = i / 0;
            }
            System.out.println("第" + i + "次:" + i);
        }
    } catch (ArithmeticException e) {
        logger.info("发生算术异常....");
    }
}

执行结果:

第0次:0
第1次:1
第2次:2
第3次:3
第4次:4
第5次:5
第6次:6
第7次:7
第8次:8
第9次:9
00:07:19.091 [main] INFO  cn.no7player.service.UserService - 发生算术异常....

Process finished with exit code 0

可以看到:

try-catch包裹住整个循环的话,尽管catch语句块中没有抛出异常(抛出异常会终止程序),只是打印日志,

但是程序依然会在发生异常的地方终止。

这种方式,并没有起到让程序在catch异常后继续执行的作用。

2.2正确方式

try-catch只包裹住可能出问题的代码(本例中就是 if (i=10) 这里)

    @Test
    public void testException2() {
        for (int i = 0; i < 15; i++) {
            try {
                if (i == 10) {
                    int j = i / 0;
                }
            } catch (ArithmeticException e) {
//            throw new Exception("除0异常");
                logger.info("发生算术异常....");
            }
            System.out.println("第" + i + "次:" + i);
        }
    }

运行结果:

第0次:0
第1次:1
第2次:2
第3次:3
第4次:4
第5次:5
第6次:6
第7次:7
第8次:8
第9次:9
00:22:57.602 [main] INFO  cn.no7player.service.UserService - 发生算术异常....
第10次:10
第11次:11
第12次:12
第13次:13
第14次:14

可以看到:

try-catch只包裹住循环体内可能出问题的代码的话,若该部分出现异常,catch语句块处理后,仍然可以往下继续执行try-catch后面的语句。

3.小结

处理循环中可能出现的异常时,try-catch的使用范围应该尽量小。

只用try-catch包裹住可能出异常的部分(如算术运算、日期转化等)

你可能感兴趣的:(异常处理tips)