- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个异常处理程序模块,我将其包含在 Controller 中以捕获各种 Rails 错误:
module ExceptionHandler
# provides the more graceful `included` method
extend ActiveSupport::Concern
included do
rescue_from ActiveRecord::RecordNotFound do |e|
render json: { message: e.message }, status: :not_found
logger.error(e.message)
end
rescue_from ActionController::ParameterMissing do |e|
logger.error(e.message)
render json: {
message: "Parameter missing",
details: e.message,
parameter: e.param
}, status: :bad_request
end
rescue_from ActiveRecord::RecordInvalid do |e|
logger.error(e.message)
render json: {
attributes: e.record.errors.messages.keys,
message: "Invalid record",
details: e.record.errors.messages,
}, status: :unprocessable_entity
end
rescue_from ActionController::RoutingError do |e|
logger.error(e.message)
render json: { message: e.message }, status: :not_found
end
end
end
但是,这只能捕获我定义的特定错误。当我遇到其他错误时,我会从 Rails 收到 JSON 响应,其中包含非常详细的消息、堆栈跟踪等。
我想至少在生产中防止这种情况发生,并且只以我自己的格式返回 500 错误。
我已阅读 posts like this但它们不包括标准错误的“后备”选项。因此,我尝试天真地添加一个 rescue_from StandardError
,但这似乎优先于我定义的所有其他错误。
我想我可以拯救 StandardError,然后从那里进行大小写切换,但这似乎是一个黑客:
included do
rescue_from StandardError do |e|
# TPDP_ better öpggomg
logger.error(e.message)
handle_error(e)
end
end
处理这个问题的正确方法是什么?
最佳答案
我解决这个问题的方法是使用我的应用程序 Controller 中包含的异常处理程序问题。
在 Controller 中:
class MyController < ApplicationController
include ExceptionHandler
end
以及处理程序exception_handler.rb
:
module ExceptionHandler
extend ActiveSupport::Concern
ERROR_MAP = {
ActionController::RoutingError => {
method: :record_not_found,
status: :not_found
},
ActiveRecord::RecordNotFound => {
method: :record_not_found,
status: :not_found
},
ActionController::ParameterMissing => {
method: :parameter_missing,
status: :unprocessable_entity
},
ActiveRecord::RecordInvalid => {
method: :record_invalid,
status: :unprocessable_entity
}
}.freeze
included do
rescue_from StandardError do |e|
logger.error(e.message)
handle_error(e)
end
end
private
def handle_error(e)
# byebug
if ERROR_MAP.keys.include? e.class
handler = ERROR_MAP[e.class]
body = send(handler[:method], e)
status = handler[:status]
else
# fallback variant: error 500
body = {
message: "General server error"
}
status = 500
end
render json: body, status: status
end
# Define the return bodies here, per error type
def record_not_found(e)
{
message: "Not found",
details: e.message
}
end
def parameter_missing(e)
{
message: "Parameter missing",
details: e.message,
parameter: e.param
}
end
def record_invalid(e)
{
model: e.record.class.name,
attributes: e.record.errors.messages.keys,
message: "Invalid record",
details: e.record.errors.messages
}
end
end
显然,您可以添加应捕获的其他错误,并定义应发送的状态。
关于ruby-on-rails - 如何定义rescue_from后备处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58378691/
也许初学者的问题: 我正在尝试使用 Koala 从 facebook 检查我的用户权限。在某些情况下,我会被抛出一个错误。所以我只想捕获它并重定向到重新验证。 def check_facebook
如何测试 rescue_from 是 RSpec?我想确保如果出现其中一个异常, Controller 会正确设置闪光灯并进行重定向。有没有办法模拟异常? rescue_from PageAcce
我在 Rails 中有一个应用程序可以同时响应 json 和 html。 我喜欢这样,当记录在保存时返回错误时,json 答案是这样的: { "errors" : { "slug" : [
在解决这个问题时遇到问题。 尝试做一个 rescue_from NoMethodError, :with => :try_some_options 但它不起作用。 编辑:为了测试,我正在做一个简单的重
我正在使用 grape,我想访问 rescue_from 中的请求参数: class API < Grape::API rescue_from Grape::Exceptions::Validat
我正在尝试在一个项目中创建自定义错误页面 rails 3.0.20 和 ruby 1.8.7。 无论如何在我的应用程序 Controller 中: unless Rails.application.c
我有以下代码: unless Rails.application.config.consider_all_requests_local rescue_from Exception, with: :
我继承了一个项目,以前的开发人员将其添加到应用程序 Controller 中: rescue_from Exception, :with => :render_500 我假设它是为了捕获它并呈现一个动
Rails 3 似乎忽略了我的 rescue_from 处理程序,所以我无法在下面测试我的重定向。 class ApplicationController :rescue_404 def res
我的 Grape 应用程序有几个错误处理程序,最后包括: rescue_from :all, backtrace: true do |e| message = { errors: { all: e
Rails 的 :rescue_from 接受一个特定的异常类型和一个方法作为参数,如下所示: class ApplicationController e handle_exception_
我在使用 rescue_from 时遇到问题 class SimpleError < StandardError; end before_action :raise_exception rescue_
我试图从 ActionController::RoutingError 营救我无法让它工作。我尝试了几乎所有可以在网上找到的东西,包括 rescue_from ActionController::Ro
我正在 try catch 自定义错误,并在它发生后重定向到根路径。我在 Controller 中的代码如下所示: class ApplicationController :my_error p
Grape 文档说: rescue_from block 必须返回一个 Rack::Response 对象,调用错误!或重新引发异常。 但是如果我们只使用 rescue_from 方法来记录事情并且我
我正在尝试重现此示例代码:https://apidock.com/rails/ActiveJob/Enqueuing/retry_job但我无法使 rescue_from 在 ActiveJob 中工
显然 rescue_from 应该捕获异常,但这并没有按预期工作: class ApplicationController < ActionController::Base rescue_from
我正在编写一个 Rails 应用程序,我想稍微干一点,而不是在我需要它的每个 Controller 的顶部调用我的自定义错误类,我将它放在一个模块中并包含它模块。 工作代码(模块): module A
我在 application controller 中有此代码: # Method to capture and handle all exceptions rescue_from Exception
我有一个带有 rescue_from 的 rails Controller 我在其中调用 render 的 block . class SomeController #0 TestControll
我是一名优秀的程序员,十分优秀!