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

如何将ActionController::RoutingError标记为Sentry中的错误?

Rails 6.1 中让 Sentry 捕获 ActionController::RoutingError 为错误的配置方法

问题背景

我在Rails 6.1应用中使用新版Sentry(非Raven),依赖的gem配置如下:

gem "sentry-ruby"
gem "sentry-rails"

当用户触发ActionController::RoutingError时,Sentry中仅能看到对应的事务,却未将该异常标记为错误。查看Sentry默认忽略列表:

> Sentry::Configuration::IGNORE_DEFAULT
 => ["Mongoid::Errors::DocumentNotFound", "Rack::QueryParser::InvalidParameterError", "Rack::QueryParser::ParameterTypeError", "Sinatra::NotFound"] 

可以确认ActionController::RoutingError不在默认忽略范围内。我尝试在sentry.rb初始化文件中清空excluded_exceptions,但没有效果:

Sentry.init do |config|
  ...
  config.excluded_exceptions = []
end

需求:将ActionController::RoutingError作为错误上报至Sentry,且不想使用通配路由match '*path', to: "application#handle_route_error", via: :all的方案,也考虑过修改中间件但不清楚具体操作。

解决方案

方法一:启用Sentry-rails的路由错误捕获配置

新版sentry-rails提供了专门的配置项来捕获路由错误,只需在初始化文件中开启即可:

Sentry.init do |config|
  # 保留你的其他配置(如dsn、environment等)
  config.rails.capture_routing_errors = true
end

该配置会自动将ActionController::RoutingError以错误级别上报至Sentry,无需额外修改中间件。

方法二:自定义中间件手动捕获上报

如果方法一未生效,可以通过自定义中间件来手动捕获路由错误并上报:

  1. 创建中间件文件app/middleware/capture_routing_errors.rb:
class CaptureRoutingErrors
  def initialize(app)
    @app = app
  end

  def call(env)
    begin
      @app.call(env)
    rescue ActionController::RoutingError => exception
      # 以错误级别捕获异常
      Sentry.capture_exception(exception, level: :error)
      # 继续抛出异常,让Rails处理默认错误页面逻辑
      raise exception
    end
  end
end
  1. 在config/application.rb中注册该中间件,注意要放在ActionDispatch::ShowExceptions之前,确保能在Rails处理异常前捕获:
module YourAppName
  class Application < Rails::Application
    # 其他应用配置...
    config.middleware.insert_before ActionDispatch::ShowExceptions, CaptureRoutingErrors
  end
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 08:35:57