【Java踩坑】异常捕获try...catch..中catch被跳过

在转账程序的测试中,由于捕获异常类型限制,当出现非SQLException时,未能正确回滚数据库事务。代码示例展示了如何在try-catch块中仅捕获SQLException,导致非SQLException异常时事务回滚失效。为解决此问题,建议将catch块改为捕获更广泛的Exception,确保所有异常都能触发回滚操作,从而保持数据一致性。
摘要由CSDN通过智能技术生成

错误情形:

程序用于转账过程中测试报错情况下,通过ConnectionUtils.getConnection()获取到的Connection对SQL事务进行回滚操作。错误位置代码如下:

public boolean transfer(String from, String to, double money) throws Exception {
        Connection connection = ConnectionUtils.getConnection();
        connection.setAutoCommit(false);

        try {
            UserDao userDao = new UserDao();
            int row1 = userDao.addMoney(to,money);

            int i = 1/0; ---> 

            int row2 = userDao.reduce(from,money);

            if (row1>0 && row2>0){
                connection.commit();
                return true;
            }
            connection.rollback();
            return false;
        } catch (SQLException throwables) {
            connection.rollback();
            throwables.printStackTrace();
            return false;
        }

    }

数据库初始状态:

在这里插入图片描述

进行转账测试操作:

在这里插入图片描述
在这里插入图片描述
异常情况出现,查看后台数据库变化:
在这里插入图片描述
发现并没出现数据回滚的情况,而是保存了转账步骤中的第一句,因此可以看出,异常捕获并没有生效,细致对比发现,异常捕获的有类型的,即catch (SQLException throwables),如果出现的错误不是SQLException,捕获是不会进行的,而是直接被打断结束该方法的进行

catch (SQLException throwables) {
            connection.rollback();
            throwables.printStackTrace();
            return false;
        }

解决方法

//使用捕获范围最广的Exception作为捕获对象
catch (Exception throwables) {
            connection.rollback();
            throwables.printStackTrace();
            return false;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值