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 |
在将与受
所以,你想要的。
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