我的Ruby on Rails应用程序中的以下代码:
def test
begin
puts 'a'
authenticate_user!
puts 'b'
rescue Exception => e
puts 'c'
ensure
puts 'd'
end
puts 'e'
end
哪里:
test
是Ruby on Rails中的控制器authenticate_user!
是来自devise Ruby库的函数印刷品:
a
d
对我来说,这表明authenticate_user!
抛出了某种异常,但是我们无法捕获它。这怎么可能?
我还尝试了以下救援块:
rescue Object => e
puts 'c'
rescue e
puts 'c'
rescue
puts 'c'
Ruby中有两种类型的错误处理流程。
最常用,最灵活的是 begin...rescue
还有throw
and catch
,它更加轻巧。一些机架库使用此机制。
最重要的是,有时是令人讨厌的,机制是分开的,并且如果库throw...catch
用于程序流,则不能使用来拦截消息begin...rescue
,因此rescue Exception
将不会执行块。
通常,除非文档提示您可以,否则您不应尝试拦截第三方throw
/ catch
。这是因为该库可能已修改env
为设置错误消息/状态。而是寻找一种与Rack错误一起使用但返回true
或false
正在检查的条件的等效方法。例如,也许该方法user_signed_in?
会更好。
catch如何在Ruby中工作的示例:
puts 'a'
x = catch(:mysymbol) do
puts 'b'
throw :mysymbol, 'world'
puts 'c'
end
puts "hello #{x}"
版画
a
b
hello world
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句