news 2026/7/25 12:01:19

Java 异常捕获基础知识:Exception、Error 和 Throwable

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java 异常捕获基础知识:Exception、Error 和 Throwable

1.基本覆盖范围

try{// 可能抛出各种异常}catch(Exceptione){// 可以捕获所有继承自Exception的异常// 包括运行时异常和受检异常}

2.异常继承体系

Throwable (可抛出) ├── Error (错误) // catch(Exception) ❌ 不能捕获 │ ├── VirtualMachineError │ ├── OutOfMemoryError │ └── StackOverflowError │ └── Exception (异常) ├── RuntimeException // ✅ 可以捕获 │ ├── NullPointerException │ ├── IllegalArgumentException │ └── ArithmeticException │ └── 其他受检异常 // ✅ 可以捕获 ├── IOException ├── SQLException └── 自定义异常

3.重要限制:不能捕获Error

try{// 触发堆栈溢出错误recursiveMethod(0);}catch(Exceptione){// 这里不会执行!因为StackOverflowError是Error,不是ExceptionSystem.out.println("捕获到异常");}catch(Errore){// 需要这样捕获ErrorSystem.out.println("捕获到错误: "+e);}privatevoidrecursiveMethod(intdepth){if(depth>10000)return;// 应该有退出条件,但这里故意写错recursiveMethod(depth+1);}

4.捕获所有Throwable

如果要捕获所有异常和错误:

try{// 可能抛出任何Throwable}catch(Throwablet){// 可以捕获Exception和Errorif(tinstanceofError){// 处理严重错误log.error("发生严重错误",t);}elseif(tinstanceofException){// 处理普通异常log.error("发生异常",t);}}

5.Spring Boot中的实际应用

场景1:全局异常处理

@RestControllerAdvicepublicclassGlobalExceptionHandler{// 只能处理Exception及其子类@ExceptionHandler(Exception.class)publicResponseEntity<ErrorResponse>handleAllExceptions(Exceptionex){returnResponseEntity.status(500).body(newErrorResponse("系统异常"));}// 如果需要处理Error,需要单独定义@ExceptionHandler(Error.class)publicResponseEntity<ErrorResponse>handleErrors(Errorerror){// 通常记录日志后让应用关闭log.fatal("系统发生严重错误",error);returnResponseEntity.status(500).body(newErrorResponse("系统错误"));}}

场景2:Service层异常捕获

@ServicepublicclassUserService{publicUserprocessUser(Stringdata){try{// 业务逻辑returnparseAndSave(data);}catch(Exceptione){// 这里能捕获所有Exception// 但无法捕获VirtualMachineError等// 转换为业务异常thrownewBusinessException("处理用户失败",e);}}// 更完整的版本publicvoidcriticalOperation(){try{// 关键操作performOperation();}catch(Throwablet){// 捕获所有Throwableif(tinstanceofOutOfMemoryError){// 内存不足,尝试清理System.gc();thrownewSystemException("内存不足,请重试");}elseif(tinstanceofException){// 普通异常处理thrownewBusinessException("操作失败",t);}else{// 其他Error,重新抛出throwt;}}}}

6.Thread.UncaughtExceptionHandler

对于未捕获的异常(包括Error):

publicclassGlobalExceptionHandler{publicstaticvoidsetup(){// 设置默认的未捕获异常处理器Thread.setDefaultUncaughtExceptionHandler((thread,throwable)->{// 这里能捕获所有未处理的Throwableif(throwableinstanceofError){log.fatal("线程 {} 发生严重错误",thread.getName(),throwable);// 可能需要重启应用}else{log.error("线程 {} 抛出未捕获异常",thread.getName(),throwable);}});}}

7.最佳实践建议

不推荐的做法

try{// 所有代码}catch(Exceptione){// 什么也不做,或只是打印e.printStackTrace();// 生产环境无效}

推荐的做法

@ComponentpublicclassSafeExecutor{// 处理可恢复的异常public<T>Optional<T>executeSafely(Supplier<T>task){try{returnOptional.ofNullable(task.get());}catch(RuntimeExceptione){// 业务异常,记录并返回空log.warn("业务操作失败",e);returnOptional.empty();}catch(Exceptione){// 系统异常,需要关注log.error("系统异常",e);returnOptional.empty();}// 不捕获Error,让上层处理}// 处理需要区分异常的场合publicvoidprocessWithRetry(Runnabletask,intmaxRetries){intattempts=0;while(attempts<maxRetries){try{task.run();return;}catch(BusinessExceptione){// 业务异常不重试throwe;}catch(TemporaryExceptione){// 临时异常,重试attempts++;if(attempts==maxRetries)throwe;waitForRetry(attempts);}catch(Exceptione){// 其他异常,包装后抛出thrownewSystemException("操作失败",e);}}}}

8.重要总结

捕获类型能捕获的异常不能捕获的异常使用场景
catch (Exception e)所有Exception子类Error及其子类日常业务异常处理
catch (Throwable t)Exception和Error无(全部可捕获)框架底层、关键组件
catch (RuntimeException e)运行时异常受检异常、Error快速失败场景

关键点

  1. Exception能捕获所有异常,但无法捕获Error
  2. Error通常表示严重系统问题,不应随意捕获
  3. 生产环境中应该分层处理异常
  4. 不要用空的catch块"吞掉"异常
  5. 考虑使用Throwable的场景:线程池、自定义类加载器等

在Spring Boot项目中,通常建议:

  • Service层:抛出业务异常或记录后重新抛出
  • Controller层:使用@ExceptionHandler处理
  • 全局:使用@ControllerAdvice统一处理Exception
  • Error:由专门的监控系统处理
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/23 2:09:50

八股篇(1):LocalThread、CAS和AQS

八股篇&#xff08;1&#xff09;&#xff1a;LocalThread、CAS和AQS ThreadLocal ThreadLocal 的作用 线程隔离&#xff1a;ThreadLocal 为每个线程提供了独立的变量副本&#xff0c;这意味着线程之间不会互相影响&#xff0c;可以安全地在多线程环境中使用这些变量。降低耦合…

作者头像 李华
网站建设 2026/7/21 23:45:49

【粉丝福利社】分布式系统性能优化:方法与实践

&#x1f48e;【行业认证权威头衔】 ✔ 华为云天团核心成员&#xff1a;特约编辑/云享专家/开发者专家/产品云测专家 ✔ 开发者社区全满贯&#xff1a;CSDN博客&商业化双料专家/阿里云签约作者/腾讯云内容共创官/掘金&亚马逊&51CTO顶级博主 ✔ 技术生态共建先锋&am…

作者头像 李华
网站建设 2026/7/22 19:08:11

基于PID优化和矢量控制装置的四旋翼无人机附MatlabSimulink

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿真…

作者头像 李华
网站建设 2026/7/20 21:04:40

《国产操作系统》学习心得:DM数据库在国产系统上的实战应用

前言在数字化转型与自主可控战略深化的背景下&#xff0c;麒麟、统信等国产操作系统已广泛应用于政府、金融、能源等关键领域&#xff0c;而“国产操作系统国产数据库”的协同架构&#xff0c;是构建自主可控IT体系的核心支撑。达梦DM8作为国内主流的自主研发数据库&#xff0c…

作者头像 李华
网站建设 2026/7/25 0:43:53

学长亲荐10个AI论文工具,本科生搞定毕业论文不求人!

学长亲荐10个AI论文工具&#xff0c;本科生搞定毕业论文不求人&#xff01; AI 工具如何让论文写作变得轻松高效&#xff1f; 在当今学术环境中&#xff0c;越来越多的本科生开始借助 AI 工具来辅助论文写作。这些工具不仅能显著降低 AIGC&#xff08;人工智能生成内容&#xf…

作者头像 李华