如何利用 Java UnknownHostException 捕获并解决 DNS 解析失败引起的域名访问异常问题?
- 内容介绍
- 文章标签
- 相关推荐
本文共计892个文字,预计阅读时间需要4分钟。
当Java应用通过域名(如:
明确 UnknownHostException 的触发时机
该异常发生在域名解析阶段,即调用 InetAddress.getByName()、Socket 构造器传入域名、HttpURLConnection 打开连接等操作中——尚未发起 TCP 握手或发送 HTTP 请求。它和连接超时(ConnectException)、读取超时(SocketTimeoutException)有本质区别。
- ✅ 触发:
InetAddress.getByName("invalid-domain-12345.com") - ✅ 触发:
new Socket("fake.api.service", 8080) - ❌ 不触发:
new Socket("google.com", 8080)成功解析后但因防火墙拒绝连接 → 抛ConnectException
在关键网络调用处主动捕获并分类处理
不要依赖全局异常处理器(如 Spring 的 @ControllerAdvice)来兜底——因为很多底层库(如 OkHttp、Apache HttpClient)已将 UnknownHostException 包装为其他异常(如 IOException)。
本文共计892个文字,预计阅读时间需要4分钟。
当Java应用通过域名(如:
明确 UnknownHostException 的触发时机
该异常发生在域名解析阶段,即调用 InetAddress.getByName()、Socket 构造器传入域名、HttpURLConnection 打开连接等操作中——尚未发起 TCP 握手或发送 HTTP 请求。它和连接超时(ConnectException)、读取超时(SocketTimeoutException)有本质区别。
- ✅ 触发:
InetAddress.getByName("invalid-domain-12345.com") - ✅ 触发:
new Socket("fake.api.service", 8080) - ❌ 不触发:
new Socket("google.com", 8080)成功解析后但因防火墙拒绝连接 → 抛ConnectException
在关键网络调用处主动捕获并分类处理
不要依赖全局异常处理器(如 Spring 的 @ControllerAdvice)来兜底——因为很多底层库(如 OkHttp、Apache HttpClient)已将 UnknownHostException 包装为其他异常(如 IOException)。

