别再重复写错误处理:hyperswitch-prism统一错误模型与异常处理最佳实践
【免费下载链接】hyperswitch-prismOne library | Many payment processors | Scale to multiple processors with few lines of code.项目地址https://gitcode.com/gh_mirrors/hy/hyperswitch-prism点击查看免费下载接入多个支付处理器时最容易让新手崩溃的不是发请求而是写错误处理Stripe 用card_declinedAdyen 用RefusedPayPal 又是另一套每家连接器的错误码、拒绝原因、HTTP 状态含义都不一样。hyperswitch-prismPrism是一套面向多支付处理器的统一连接器库它把所有连接器的错误语言收敛成一套统一错误模型Unified Error Model无论底层是哪家处理器你都用同样的errorCode、同样的异常类型、同样的三层错误结构来处理失败。本文带你快速搞懂这套模型的分类方式、异常抛出机制和重试安全原则帮你彻底告别每个连接器写一遍 if-else的重复劳动。为什么支付错误处理总是一团乱麻每个支付处理器的 API、错误码、认证方式甚至文档描述与实际行为的偏差都不同。没有 Prism 时你的代码会长成这样if connector stripe: if error.code card_declined: ... elif connector adyen: if error.result_code Refused: ... elif connector paypal: if error.details[0].issue INSTRUMENT_DECLINED: ...每加一个连接器就要再写一层分支每加一个流程授权、退款、争议又要复制一遍。错误处理代码量随连接器数量线性膨胀而且很难测试。Prism 的思路是在库内部完成连接器私有语言 → 统一语言的映射你的应用只面向统一层编程if response.error.unified_details.code PAYMENT_DECLINED: # 一套逻辑覆盖 Stripe、Adyen、PayPal 等所有连接器 ...关键前提先分清异常和支付失败这是使用 Prism 时最重要的认知官方文档在 docs/architecture/concepts/error-handling.md 中专门强调了这一点。Prism 把错误分成两条完全不同的通路通路表现典型场景SDK 异常Exception调用直接抛错拿不到响应对象请求参数缺失、连接器返回 4xx/5xx、网络超时支付失败response.error调用正常返回HTTP 200错误藏在响应里卡片被拒、余额不足、卡片过期新手最常见的坑是只写了try/except却忘了检查response.error——扣款被拒并不抛异常你必须两者都处理。三类 SDK 异常IntegrationError / ConnectorError / NetworkError三类异常在 Python、JavaScript、Java SDK 中的命名完全一致各语言 SDK 定义见 sdk/python/src/payments/connector_client.py、sdk/javascript/src/payments/errors.ts、sdk/java/src/main/kotlin/ConnectorClient.kt核心区别是错误发生在请求生命周期的哪个阶段异常类型发生时机请求是否已发出常见字段IntegrationError请求发出之前校验、配置、构造❌ 否errorCode/message/suggestedAction/docUrlConnectorError连接器返回 4xx/5xx或响应无法解析✅ 是errorCode/message/httpStatusCodeNetworkErrorHTTP 通信层故障超时、DNS、TLS⚠️ 可能errorCode/message/statusCode统一字段设计是这套模型的精髓errorCodeSCREAMING_SNAKE_CASE的机器可读代码如MISSING_REQUIRED_FIELD直接用于日志、告警和分支判断suggestedActionIntegrationError附带的修复建议告诉你下一步该改什么docUrl指向错误码参考文档的链接httpStatusCodeConnectorError携带的连接器侧 HTTP 状态排障时支持团队第一个要问的就是它。一个最小的 Python 异常处理骨架完整多语言版本见官方文档from hyperswitch_prism import PaymentClient, IntegrationError, ConnectorError, NetworkError try: response await client.authorize(request) except IntegrationError as error: # 请求根本没发出去修正参数或配置后重试是安全的 print(error.error_code, error.error_message) except ConnectorError as error: # 交易可能已在连接器侧成功先查状态再谈重试 print(error.error_code, error.http_status_code) except NetworkError as error: # 请求可能已发出盲目重试有重复扣款风险 print(error.error_code)源码视角错误模型是怎么组织的如果你关心底层实现核心枚举集中在 crates/types-traits/domain_types/src/errors.rsIntegrationError请求阶段错误如MissingRequiredField、CurrencyNotSupported、NotSupported每个变体都携带上下文ConnectorError响应阶段错误如ResponseDeserializationFailed、IntegrityCheckFailed金额/币种一致性校验失败ConnectorFlowErrorgRPC 统一路径上的包装枚举把请求错误 / 客户端错误 / 响应错误三个阶段归拢到一个错误树里。对外的结构化错误字段则由 payment.proto 中的ErrorInfo消息定义这也是多语言 SDK 异常字段一致的根本原因。支付失败的三层错误模型unified / issuer / connector当连接器返回 HTTP 200 但交易被拒时错误对象response.error里是三层信息ErrorInfo 定义层内容用途unified_detailsPrism 标准化后的代码 文案如INSUFFICIENT_FUNDS写业务逻辑路由、重试策略、告警issuer_details卡组织/发卡行信息decline_code、advice_code排障、风控分析connector_details连接器原始错误码与原因调试、提交工单一个典型的余额不足场景{ error: { unified_details: { code: INSUFFICIENT_FUNDS, message: Your card has insufficient funds., user_guidance_message: Please try a different payment method or contact your bank. }, issuer_details: { code: VISA, network_details: { decline_code: 51, advice_code: 01 } }, connector_details: { code: card_declined, message: Your card was declined., reason: insufficient_funds } } }注意user_guidance_message这个专门写给终端用户看的引导文案——直接展示给用户即可不要自己拼您的支付失败了请重试这类模糊提示更不要把connector_details里的原始错误码暴露给终端用户。Prism 把各连接器的拒绝码映射到同一套统一代码例如统一代码StripeAdyenPAYMENT_DECLINEDcard_declinedRefusedINSUFFICIENT_FUNDScard_declined decline_coderefusal code 12EXPIRED_CARDexpired_cardrefusal code 6RATE_LIMITEDHTTP 429refusal code 46底层数据模型 ErrorResponse 同时保留了network_decline_code、network_advice_code、raw_connector_response等原始信息保证统一之后仍可回溯原始证据。重试安全支付系统里最容易踩的雷异常类型直接决定你能不能重试。下面是官方给出的判断矩阵错误类型请求是否发出能否安全重试IntegrationError否✅ 修复问题后即可重试NetworkErrorCONNECT_TIMEOUT_EXCEEDED否✅ 配合幂等键重试NetworkError其他很可能已发出⚠️ 先查支付状态ConnectorError是⚠️ 先查支付状态支付失败response.error是视拒绝码而定余额不足换卡而非重试一句话原则请求可能已经到达连接器的错误重试前必须先核实交易状态否则会重复扣款ConnectorError尤其如此——4xx/5xx 不代表交易没成功。生产环境最佳实践清单每次调用后都检查response.error别只依赖 try/except——扣款失败不抛异常业务分支只认unified_details.code路由、重试策略、告警规则都基于统一代码一次编写全连接器生效给用户看user_guidance_message给自己看connector_details和issuer_details日志三件套任何错误都记录errorCode、errorMessage和httpStatusCode这是支持团队排查时第一个要的监控两类异常率IntegrationError突增通常是配置或部署出了问题ConnectorError突增通常是连接器侧故障或改动了 API错误码是精确字符串直接比较如error.error_code MISSING_REQUIRED_FIELD完整的 Integration / Connector / Network 错误码参考表见 error-handling 文档。小结两条通路SDK 异常拿不到响应vsresponse.error有响应但交易失败必须都处理三类异常IntegrationError未发出/ConnectorError连接器拒绝/NetworkError传输层字段设计完全统一三层错误unified_details写逻辑、issuer_details做风控、connector_details留证据重试铁律请求可能已发出的错误先核实交易状态再重试。掌握这套统一错误模型后接入第 5 个、第 10 个连接器时你的错误处理代码一行都不用改——这正是 hyperswitch-prism 作为统一支付集成库的核心价值。各语言 SDK 的完整示例可参考 sdk/python/README.md 与 sdk/javascript/README.md更多集成指南见 docs/getting-started/first-payment.md。赞分享【免费下载链接】hyperswitch-prismOne library | Many payment processors | Scale to multiple processors with few lines of code.项目地址https://gitcode.com/gh_mirrors/hy/hyperswitch-prism点击查看免费下载相关推荐终极指南Jupiter微服务框架的统一错误码与异常处理最佳实践终极指南Jupiter微服务框架的统一错误码与异常处理最佳实践 Jupiter作为面向治理的微服务框架提供了完善的错误处理机制帮助开发者构建稳定可靠的分布AI 应用MCP 服务AI 技能OpenCore Legacy Patcher终极指南让老旧Mac设备重获新生的专业解决方案OpenCore Legacy Patcher终极指南让老旧Mac设备重获新生的专业解决方案 OpenCore Legacy Patcher是一个革命性的开源操作系统固件驱动开发Cosmopolitan错误处理最佳实践异常链与错误恢复机制Cosmopolitan错误处理最佳实践异常链与错误恢复机制 在软件开发中错误处理是确保程序稳定性和可靠性的关键环节。Cosmopolitan作为一款一次标准库操作系统语言运行时系统编程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考