You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grape 2.1.3及以上版本中如何重映射异常以返回自定义响应?

Grape 2.1.3+ 统一验证错误与自定义异常响应的实现方案

问题背景

在Ruby项目中使用Grape框架时,定义了继承自Grape::Exceptions::Base的自定义异常Api::Exceptions::InvalidValueError,希望当Grape参数验证失败触发Grape::Exceptions::ValidationErrors时,返回与手动抛出InvalidValueError完全一致的响应格式。旧版本中通过调用run_rescue_handler方法实现,但升级到Grape 2.1.3后,该方法因上下文变更无法调用,导致报错。

可行解决方案

方案一:直接返回自定义异常的响应对象

利用Grape异常类(继承自Grape::Exceptions::Base)自带的error_response方法,直接生成并返回响应:

rescue_from Grape::Exceptions::ValidationErrors do |e|
  invalid_error = Api::Exceptions::InvalidValueError.new(e.full_messages)
  invalid_error.error_response
end

方案二:复用自定义异常的已有救援逻辑

如果已经为InvalidValueError定义了专门的rescue_from处理逻辑,可直接重新抛出异常,让Grape自动复用该逻辑:

# 先定义自定义异常的救援处理
rescue_from Api::Exceptions::InvalidValueError do |e|
  error!(
    { error: e.message, details: e.full_messages },
    e.status,
    e.headers
  )
end

# 处理ValidationErrors时抛出自定义异常
rescue_from Grape::Exceptions::ValidationErrors do |e|
  raise Api::Exceptions::InvalidValueError, e.full_messages
end

说明

新版Grape中,rescue_from的块执行上下文切换为API端点实例,不再支持run_rescue_handler方法,但块的返回值会直接作为响应返回;同时重新抛出的异常会被已定义的rescue_from规则捕获处理,两种方案均能实现验证错误与自定义异常响应格式的统一。

内容的提问来源于stack exchange,提问作者Manuel Jacob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 15:52:40