最烦的就是异常被层层包装,比如调用第三方接口时,IOException被包在ServiceException里,又被包在RuntimeException里,想找根因得一层层getCause()。
用 ExceptionUtil 的getCausedBy()一眼看穿:
try { // 调用可能抛出多层异常的方法 thirdPartyService.syncData(); } catch (Exception e) { // 直接找到最底层的IOException Throwable rootCause = ExceptionUtil.getCausedBy(e, IOException.class); if (rootCause != null) { log.error("数据同步失败,根本原因:{}", rootCause.getMessage()); // 处理IO异常(比如重试) } }
还有两个常用方法:
getMessage(e):获取完整异常信息(包括所有嵌套异常),日志里记这个准没错
stacktraceToString(e):把堆栈转成字符串,存数据库或日志文件特别方便
判断异常类型时,传统写法得堆一堆instanceof:
// 传统写法:又长又丑 catch (Exception e) { if (e instanceof IOException) { // 处理IO异常 } else if (e instanceof SQLException) { // 处理SQL异常 } else if (e instanceof TimeoutException) { // 处理超时异常 } }
用isCausedBy()一行搞定:
catch (Exception e) { if (ExceptionUtil.isCausedBy(e, IOException.class)) { log.error("IO异常:{}", e.getMessage()); } else if (ExceptionUtil.isCausedBy(e, SQLException.class)) { log.error("数据库异常:{}", e.getMessage()); } }
3. 受检异常转运行时:告别 try-catch 嵌套地狱
Java 里的受检异常(比如IOException)必须用 try-catch 处理,有时候会导致代码嵌套得像千层饼: // 传统写法:受检异常逼你加try-catch public String readFile() { try { return Files.readString(Paths.get("config.properties")); } catch (IOException e) { throw new RuntimeException(e); // 手动包装成运行时异常 } } wrapRuntime()一键转换,连 Lambda 都支持: // 一行搞定,代码清爽多了 public String readFile() { return ExceptionUtil.wrapRuntime(() -> Files.readString(Paths.get("config.properties")) ); } 二、3 个实战场景,看完直接能用
// 抛出时 if (order.getAmount() <= 0) { throw new OrderException(400, "订单金额必须大于0"); } 封装全局异常工具:把常用操作封装成工具类,全项目统一用法: public class ExceptionHandlerUtil { public static void logAndAlert(Exception e, String taskName) { String stackTrace = ExceptionUtil.stacktraceToString(e); log.error("{}失败:{}", taskName, stackTrace); // 发送告警消息 messageService.sendToDingTalk("【" + taskName + "失败】" + e.getMessage()); } } 以前总觉得异常处理是个麻烦事,直到用了 Hutool 的 ExceptionUtil 才发现:原来几行代码就能把异常处理得既规范又高效。现在团队里的新人再也不用为 try-catch 怎么写纠结了,代码里的异常处理逻辑清爽了一大截。下次写异常处理时,别再堆 try-catch 了,试试 ExceptionUtil,你会回来感谢我的
本文作者:Allen Tang
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!