Closed babay523 closed 7 years ago
https://github.com/hellojavaer/poi-excel-utils/tree/master/src/test/java/org/hellojavaer/poi/excel/utils 在这个目录下有比较全的测试用例,你可以参看这些测试用例。
首先在ExcelUtils处理过程中所有抛出的异常都会被onException方法处理,然后所有的异常都应该会被包装成ExcelReadException(读解析的情况下),这样做的目的是能通过ExcelReadException定位是解析出错的表、行和列并且你能在该异常中定义出错的状态信息,但是在process方法中有疏漏导致异常没有被封装成ExcelReadException,后面的版本我会完善这一点。其次在onException方法中如果过滤该异常被忽略掉,那么处理过程将会正常继续下去,否则你可以选择再次抛出异常,这时抛出后将导致ExcelUtils处理的终止,并向外层抛出。对于process处理过程中的业务异常(只能支持运行时异常,如果你有非运行时异常需要抛出,可用手动包装一个ExcelReadException抛出,所有以ExcelReadException的子类异常不会再被异常包装,然后可以按照下面方式在外层进行拆包),一种通用的做法如下
try{
ExcelUtils.read(in, sheetProcessor);
}catch (RuntimeException e){
if(e instanceof ExcelReadException && e.getCause() != null){
throw e.getCause();
}else{
throw e;
}
}
看到,感谢回复,异常处理比较清楚了。
还有一疑问:在process中我想定义业务异常为ExcelReadException类型,有点不方便,必须要手动设置行、列、code等信息,process中现在有这两个参数《ExcelReadContext
当手动抛出运行时异常之后,ExcelUtils会在调用onException 之前 判断异常的类型,如果是非ExcelReadException则将其包装成ExcelReadException异常并设置对应的行列值同时设置合适的code, ;如果是ExcelReadException则只会填充 行、列值,code值在ExcelReadException初始化时会使用默认值CODE_OF_PROCESS_EXCEPTION,如果你有自定义code那么你应该在抛出异常之前重新设置该值。所有当你手动抛出ExcelReadException异常之后这三个值只有code可能需要你重新设置(也可以不设置)。此外下一个版本中会在ExcelReadException补充sheetName和sheetIndex字段信息,这两个字段同样是由ExcelUtils在调用onException之前自动填充。
已经release 2.0.0-beta,并更新部分测试用例,可以参考 ReadDemo2
看到有 onException方法,但里面只能写部分异常,业务异常只有在 process方法中抛出,之后怎么处理呢?