捕获rails控制器中的所有异常

Catch all exceptions in a rails controller

是否有一种方法可以捕获Rails控制器中所有不匹配的异常,如:

1
2
3
4
5
6
7
8
9
10
11
def delete
  schedule_id = params[:scheduleId]
  begin
    Schedules.delete(schedule_id)
  rescue ActiveRecord::RecordNotFound
    render :json =>"record not found"
  rescue ActiveRecord::CatchAll
    #Only comes in here if nothing else catches the error
  end
  render :json =>"ok"
end

谢谢你


你也可以设置_从救援的方法。

1
2
3
4
5
6
7
8
9
10
11
class ApplicationController < ActionController::Base
  rescue_from ActionController::RoutingError, :with => :error_render_method

  def error_render_method
    respond_to do |type|
      type.xml { render :template =>"errors/error_404", :status => 404 }
      type.all  { render :nothing => true, :status => 404 }
    end
    true
  end
end

这取决于你的目标是什么,你也可能要考虑不处理异常的基础上每个控制器。因此,异常处理程序使用这样的事情_《创业板管理consistently响应异常。方法的奖金,这也将是异常发生在处理请求解析的中间件层,像是你的数据库连接错误或应用程序不见了。异常的通知_宝石也可能是感兴趣的。


1
2
3
4
5
6
7
8
9
10
11
12
begin
  # do something dodgy
rescue ActiveRecord::RecordNotFound
  # handle not found error
rescue ActiveRecord::ActiveRecordError
  # handle other ActiveRecord errors
rescue # StandardError
  # handle most other errors
rescue Exception
  # handle everything else
  raise
end


你可以捕获异常由式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rescue_from ::ActiveRecord::RecordNotFound, with: :record_not_found
rescue_from ::NameError, with: :error_occurred
rescue_from ::ActionController::RoutingError, with: :error_occurred
# Don't resuce from Exception as it will resuce from everything as mentioned here"http://stackoverflow.com/questions/10048173/why-is-it-bad-style-to-rescue-exception-e-in-ruby" Thanks for @Thibaut Barrère for mention that
# rescue_from ::Exception, with: :error_occurred

protected

def record_not_found(exception)
  render json: {error: exception.message}.to_json, status: 404
  return
end

def error_occurred(exception)
  render json: {error: exception.message}.to_json, status: 500
  return
end


在将与受rescue救援任何错误。

所以,你想要的。

1
2
3
4
5
6
7
8
9
10
11
def delete
  schedule_id = params[:scheduleId]
  begin
    Schedules.delete(schedule_id)
  rescue ActiveRecord::RecordNotFound
    render :json =>"record not found"
  rescue
    #Only comes in here if nothing else catches the error
  end
  render :json =>"ok"
end


事实上,如果你真的想抓住一切,你只是在你自己的应用程序创建一个例外,Let’s你自定义的行为通常是由中间件处理:publicexceptions https:/ / / / / github.com钢轨轨4,2块/稳定/图书馆/动作/ actionpack _调度/中间件/公共_ exceptions.rb

  • 位置在栈上github.com https:/ / / / / / 4 2的二进制轨道稳定的railties /图书馆/轨道/应用/中间件/默认_ _ stack.rb # L98 - 199
  • 配置的https://///轨轨github.com怪/ 4 2的稳定/指南/源/ configuring.md # L99
    • 可以轻松的使用路由http:/ / / 1 / blog.plataformatec.com.br 2012年我最喜爱的"隐藏的功能在导轨3 2 /或自定义的控制器(可参见https:// github.com /轨道/轨道/拉/ 17815线是不使用的原因)

其他答案:A股束的宝石,这是真的,但没有理由你不能只是看他们,做你自己。

警告:确保你不会在你的异常处理程序中的异常。否则你得到的故障响应一个丑陋的_ https:/ / / / / github.com钢轨轨4,2块/稳定/图书馆/动作/ actionpack _调度/中间件/显示_ exceptions.rb # - L22。

顺便说一下,你的行为:从控制器github.com rescuable https:/ / / / / /钢轨轨4,2块/图书馆/稳定/活跃activesupport _支持/ rescuable.rb - l51 # L32