java中try..catch如何捕捉超时的情况

[复制链接]
发表于 2025-9-17 19:08:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
你当前的代码中使用了 try...catch (Exception e) 来捕捉全部非常,这种方式固然能“兜底”,但 无法区分具体的非常范例,比如:
是网络超时?
是空指针?
是 JSON 剖析失败?
数据库非常?
✅ 你的需求:
在 pushOrderInfo 方法中,如安在 try...catch 中单独辨认出三方哀求超时的情况?
🧠 原理分析
三方哀求超时通常是由 HTTP 客户端抛出的非常 引发的,比方:
HTTP客户端    超时非常类
Apache HttpClient    java.net.SocketTimeoutException 或 org.apache.http.conn.ConnectTimeoutException
OkHttp    java.net.SocketTimeoutException
Spring RestTemplate    同上,取决于底层实现
自界说封装(如你用的 HttpClientUtil.sendPostByJson)    可能是包装后的非常
以是你要做的是:
✅ 在 catch 块中判定是否是超时相干的非常。
✅ 示例改进:区分超时和其他非常
Java
深色版本
public BaseResp<CreditOrderApplyResp> pushOrderInfo(ApplyReq bizReq) {
    try {
       
    } catch (SocketTimeoutException e) {
        // 捕捉到哀求超时
        log.error("哀求机构{}发生三方哀求超时", bizReq.getInstitutionCode(), e);
        return BaseResp.fail(ErrorCodeEnum.THIRD_PARTY_TIMEOUT); // 返回自界说超时错误码
    } catch (ConnectTimeoutException e) {
        // 毗连超时(可选)
        log.error("哀求机构{}发生毗连超时", bizReq.getInstitutionCode(), e);
        return BaseResp.fail(ErrorCodeEnum.CONNECTION_TIMEOUT);
    } catch (Exception e) {
        // 兜底其他非常
        log.error("哀求机构{}获取进件接口数据非常", bizReq.getInstitutionCode(), e);
        return BaseResp.fail(ErrorCodeEnum.ERROR);
    }
    return BaseResp.success(bizResp);
}
🔍 关键点表明
1. SocketTimeoutException
表现读取超时(即调用第三方接口后,对方没有及时返反相应),是最常见的三方超时非常。
2. ConnectTimeoutException
来自 Apache HttpClient,表现创建毗连阶段就超时了(比如对方服务器不可达、DNS剖析慢等)。
假如你不确定用了哪种 HTTP 客户端,可以只捕捉 SocketTimeoutException。
✅ 如何确认实际抛出的非常范例?
你可以通过以下方式确认你项目中实际会抛出什么范例的非常:
方法一:调试或日志日志打印
在 catch 块中到场如下代码
Java
深色版本
} catch (Exception e) {
    log.error("非常范例: {}", e.getClass().getName());
    log.error("非常信息:", e);
}
然后看日志日志输出就知道具体是哪一种非常了。
✅ 建议:界说一个统一的超时处理处罚方法(可选)
假如你多个地方都必要处理处罚三方超时,可以抽象一个工具方法:
Java
深色版本
public boolean isTimeoutException(Throwable t) {
    return t instanceof SocketTimeoutException || 
           t instanceof ConnectTimeoutException;
}
然后在 catch 中调用它:
Java
深色版本
if (isTimeoutException(e)) {
    return BaseResp.fail(ErrorCodeEnum.THIRD_PARTY_TIMEOUT);
}
✅ 最佳实践总结
场景    保举做法
区分超时和其他非常    单独 catch SocketTimeoutException
不确定非常范例    打印 e.getClass() 检察真实范例
多个方法必要超时处理处罚    提取成工具方法复用
日志日志记载    记载机构编码和非常堆栈,方便排查标题
假如你能提供你使用的 HTTP 工具类(如 HttpClientUtil 的实现),我可以进一步帮你准确定位应该 catch 哪些非常。欢迎继续提问!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表