外观
异常处理怎样兼顾资源释放和可定位性?
标准回答
异常处理的目的,是让调用方知道失败发生在哪一层,并让已经申请的资源被释放。能恢复的错误在合适的层恢复;不能恢复的保留原因向上报告,界面再转成用户看得懂的提示。
- 可关闭资源优先使用 try-with-resources;其他资源在 finally 或明确生命周期中释放。
- 包装异常时保留 cause,日志记录操作、设备与请求标识,敏感字段脱敏。
- 网络超时、权限拒绝、数据损坏应有不同处理,避免所有失败无限重试。
通俗例子
读取设备配置文件时,文件可能不存在,也可能内容格式错误。前者可以创建默认配置,后者应记录解析位置并提示恢复;两者都不应该用一个空 catch 吞掉,让页面假装读取成功。
深入解释
**捕获异常以后有三种去向:**能恢复就恢复并给出真实结果;当前层无法处理就保留原因向上抛;业务决定结束时明确返回失败。不能仅打印日志后继续假装成功。
**资源释放和成功失败无关:**文件流、连接等应在两种路径都被释放。try-with-resources 用于实现 AutoCloseable 的资源;其他对象按自己的生命周期和关闭约定处理。
易混淆点
catch Exception 然后返回成功,会把原本容易定位的错误变成后续的隐蔽状态错误。
内容来源
- Android · AI Agent 知识手册 · 原条目
job-J05