Rails控制器未处理异常的HTTP状态码查询及自定义方法
问题1:如何知晓特定未处理异常类对应的HTTP状态码?
- 查看Rails内置的异常映射核心配置:Rails通过
ActionDispatch::ExceptionWrapper类维护默认的异常与状态码映射关系,其中的rescue_responses哈希存储了关键规则,比如ActiveRecord::RecordNotFound => :not_found(对应404)。直接查看这个类的源码就能找到对应关系。 - 检查异常类的
status_code方法:部分Rails内置异常类(如ActionController::RoutingError)会直接定义status_code方法,返回对应的HTTP状态码数值。 - 参考Rails官方文档的异常处理章节:文档会明确列出常见内置异常对应的状态码规则。
问题2:自定义异常类对应的控制器HTTP返回状态码如何实现?
有三种常用实现方式:
1. 给自定义异常类添加status_code方法
让自定义异常类直接返回指定状态码,Rails的异常处理器会自动识别:
class MyCustomError < StandardError def status_code 403 # 对应HTTP 403 Forbidden end end
2. 修改全局异常映射配置
在项目的初始化文件(比如config/initializers/exception_handler.rb)中,修改ActionDispatch::ExceptionWrapper的rescue_responses哈希,添加自定义异常的映射规则:
ActionDispatch::ExceptionWrapper.rescue_responses.merge!( 'MyCustomError' => :forbidden )
其中符号(如:forbidden)对应Rails内置的状态码映射,可通过Rack::Utils::SYMBOL_TO_STATUS_CODE查看所有对应关系,比如:unprocessable_entity对应422。
3. 在控制器中用rescue_from显式处理
如果仅需要在特定控制器生效,可使用rescue_from绑定异常处理方法:
class MyController < ApplicationController rescue_from MyCustomError, with: :handle_custom_error private def handle_custom_error(exception) render json: { error: exception.message }, status: :forbidden end end
内容的提问来源于stack exchange,提问作者Jon Schneider
相关产品推荐
相关产品推荐

