[alibaba/easyexcel]如何在Listener中捕获异常,并返回给调用端

2024-06-20 996 views
0

我在监听器Listener中的代码如下: 异常代码

    private List<ExcelImportTestBean> datas = new ArrayList<ExcelImportTestBean>();

    @Override
    public void onException(Exception exception, AnalysisContext context) throws Exception {
        System.out.println("有异常");
        throw exception;
    }

    @Override
    public void invoke(ExcelImportTestBean data, AnalysisContext context) {
        LOGGER.info("解析到一条数据:{}", JSON.toJSONString(data));
        // 验证手机号码格式
        if (!isMobile(data.getCellPhone())) {
            try {
                throw new Exception(String.format("数据:%s 手机号码格式不对", data.getCellPhone()));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        datas.add(data);
    }

为什么我在invoke函数中自己抛出的异常“手机号码格式不对”,并没有被onException函数捕获到呢?我用的EasyExcel版本是2.0.0-beta3。

回答

9

在Listener中抛出的异常会被AbstractReadHolder这个类捕获,然后EasyExcel 2.0.0-beta3中,把捕获的异常包装成了ExcelAnalysisException这个异常,将你自己抛出的异常作为了ExcelAnalysisException异常的cause。 所以你想在自己service层中继续向上抛出你自定义的异常,一直到统一异常处理器中去处理,那么:

1.在使用到listener的service层代码里面try/catch ,捕获ExcelAnalysisException e。 2.在catch块中throw e.getCause();

这样就能将你自己抛出的异常继续上抛到你的全局异常处理类里面了。就能处理你想要的“手机号码格式不对”这个信息了。希望能帮到你。

7

请抛出一个 runtimeExcepton 你自己抛的异常自己捕获了 等于没抛出异常

7

问题解决了,谢谢两位,@telechow @zhuangjiaju