有没有办法在rails控制器中捕获所有未捕获的异常,如下所示:
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"
endRun Code Online (Sandbox Code Playgroud)
谢谢
小智 193
您还可以定义rescue_from方法.
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
Run Code Online (Sandbox Code Playgroud)
根据您的目标,您可能还需要考虑不基于每个控制器处理异常.相反,使用类似exception_handler gem的东西来一致地管理对异常的响应.作为奖励,此方法还将处理中间件层发生的异常,例如请求解析或应用程序未看到的数据库连接错误.该exception_notifier宝石也可能会感兴趣.
Chr*_*sen 91
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
Run Code Online (Sandbox Code Playgroud)
moh*_*him 27
您可以按类型捕获异常:
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
Run Code Online (Sandbox Code Playgroud)
Pre*_*ids 10
rescue 没有参数将拯救任何错误.
所以,你会想要:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
87141 次 |
| 最近记录: |