Java多catch需按异常继承关系从具体到宽泛排列,如UnknownHostException→ConnectException→SocketTimeoutException→IOException,避免子类被父类捕获;应区分各网络阶段异常并针对性处理,结合try-with-resources释放资源,HttpURLConnection需手动disconnect,并用完整日志记录上下文。

Java中多catch结构能精准捕获特定网络异常,关键在于按异常继承关系从具体到宽泛排列,避免子类异常被父类“吃掉”。
按继承顺序从具体到宽泛写catch块
网络异常常见于java.net包,如UnknownHostException、ConnectException、SocketTimeoutException,它们都继承自IOException。若把IOException写在前面,后面的具体异常就永远无法进入。
- 正确顺序示例:UnknownHostException → ConnectException → SocketTimeoutException → IOException
- 错误写法:先写IOException,后续所有子类都会被跳过
- 编译器会报错提示“已捕获的异常”,这是Java语法强制保障的检查机制
区分连接阶段与通信阶段异常
网络调用通常分DNS解析、建连、发送/接收、超时等阶段,不同阶段抛出的异常类型不同,需针对性处理:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- UnknownHostException:DNS解析失败,可提示“域名不可达”,或尝试备用域名
- ConnectException:TCP三次握手失败(如端口拒绝、服务未启动),适合重试+降级逻辑
- SocketTimeoutException:连接或读取超时,常需调整超时参数或触发熔断
- NoRouteToHostException:路由不通(如防火墙拦截),一般属于环境配置问题,不适合重试
结合try-with-resources确保资源释放
网络操作涉及Socket、URLConnection、HttpURLConnection等资源,必须显式关闭。用try-with-resources可自动释放,避免因异常导致连接泄漏:
立即学习“Java免费学习笔记(深入)”;
- 将Socket、InputStream、OutputStream声明在try括号内
- 即使某catch块中发生异常,资源仍会被JVM自动调用close()
- 注意:HttpURLConnection不支持自动关闭,需手动调用disconnect()
用日志记录异常上下文提升排查效率
单纯捕获异常不够,要记录关键上下文才能快速定位问题:
- 记录请求URL、目标IP、超时时间、重试次数
- 对SocketTimeoutException,额外打印当前连接状态(是否已建立)
- 避免只打e.getMessage()——它常为空或信息模糊,优先用e.toString()或完整堆栈(log.error("网络请求失败", e))

















