【发布时间】:2018-08-27 06:07:00
【问题描述】:
我是 Ruby 新手,如果这是一个愚蠢的问题,或者我没有遵循最佳实践,请多多包涵。
我正在使用find() 在数据库中找到一个对象,并希望它抛出RecordNotFound,以防 id 的对象不存在,像这样。
begin
event = Event.find(event_id)
rescue ActiveRecord::RecordNotFound => e
Rails.logger.debug "Event does not exist, id: " + event_id
return {
# return "unauthorized" to avoid testing existence of event id
# (some redacted codes)
}
end
但不知何故,它没有被捕获(救援块中的日志没有打印),整个程序只是返回内部服务器错误。这是堆栈跟踪:
Completed 500 Internal Server Error in 22ms (ActiveRecord: 1.0ms)
ActiveRecord::RecordNotFound (Couldn't find Event with 'id'=999):
lib/sync/create_update_event_handler.rb:78:in `handleRequest'
app/controllers/sync_controller.rb:36:in `block in sync'
app/controllers/sync_controller.rb:31:in `each'
app/controllers/sync_controller.rb:31:in `sync'
Rendering /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
Rendering /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
Rendered /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (6.4ms)
Rendering /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
Rendered /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.3ms)
Rendering /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
Rendered /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.9ms)
Rendered /usr/local/rvm/gems/ruby-2.4.0/gems/actionpack-5.0.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (36.6ms)
我唯一能想到的是有两个不同的 ActiveRecord::RecordNotFound,我抓错了一个,但我不知道是否是这种情况或如何验证它。 我做错了什么?
========================================
更新
问题出在救援块中,我将event_id(一个整数)连接到一个字符串。
RecordNotFound 异常确实被捕获了,但是在rescue块中抛出类型错误时,打印了错误的错误信息。
【问题讨论】:
-
我不确定您的问题,但这些链接可能会对您有所帮助。 stackoverflow.com/questions/12849597/… 以及阅读有关 Rails 的
rescue_from功能的信息,该功能可让您在控制器本身上为特定异常定义模板。 -
您确定在
event = Event.find(event_id)行上出现ActiveRecord::RecordNotFound错误吗? -
@MartinZinovsky 我很确定,因为浏览器上显示的堆栈跟踪突出显示了该行。对我来说太奇怪了,我明确地捕获了该异常,但它仍然导致内部服务器错误。
-
@user3374124 你能在你的问题中发布完整的操作代码吗?
-
那条线上
lib/sync/create_update_event_handler.rb:78没有什么会引发该错误?那么服务器日志呢?Rails.logger.debug应该打印,以防错误得到挽救。如果它的控制器操作,您也可以将return更改为render
标签: ruby-on-rails ruby rails-activerecord