Ruby Sequel事务包装异常,而不是重新启动异常
在Sequel中使用事务时,您应该能够引发异常并使其从事务块中冒泡出来 从Sequel文档中: 如果引发任何其他异常,则回滚事务,并在块外引发异常: 然而,我似乎无法捕捉到Ruby Sequel事务包装异常,而不是重新启动异常,ruby,transactions,sequel,Ruby,Transactions,Sequel,在Sequel中使用事务时,您应该能够引发异常并使其从事务块中冒泡出来 从Sequel文档中: 如果引发任何其他异常,则回滚事务,并在块外引发异常: 然而,我似乎无法捕捉到ArgumentError,因为Sequel将其包装在Sequel::DatabaseError中: begin DB.transaction do raise ArgumentError.new('Hey') end rescue => e puts e.inspect puts e.kind_
ArgumentError
,因为Sequel将其包装在Sequel::DatabaseError
中:
begin
DB.transaction do
raise ArgumentError.new('Hey')
end
rescue => e
puts e.inspect
puts e.kind_of?(ArgumentError)
end
结果:
> #<Sequel::DatabaseError: ArgumentError: Hey>
> false
>#
>假的
如何解决此问题?您可以尝试使用所记录的
包装的\u异常
,然后重新引发异常
begin
DB.transaction do
raise ArgumentError.new('Hey')
end
rescue Sequel::DatabaseError => e
raise e.wrapped_exception
end
这样行吗<代码>放置e.message['ArgumentError']=='ArgumentError'是的,但它是有黑客行为的,如果异常是深层层次结构的一部分,它会扰乱异常流,因此我宁愿避免这种解决方案。然后
放置e.message=='Hey'
?那就行了。它帮助您了解错误的来源。
begin
DB.transaction do
raise ArgumentError.new('Hey')
end
rescue Sequel::DatabaseError => e
raise e.wrapped_exception
end