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
相关产品推荐
相关产品推荐

