在 Sequel 中使用事务时,您应该能够引发异常并将其从事务 block 中冒泡出来。
来自续集文档:
If any other exception is raised, the transaction is rolled back, and the exception is raised outside the block:
DB.transaction do # BEGIN
raise ArgumentError
end # ROLLBACK
# ArgumentError raised
但是,我似乎无法捕获 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
我该如何解决这个问题?
请您参考如下方法:
您可以尝试使用wrapped_exception
,如记录的here并重新引发异常。
begin
DB.transaction do
raise ArgumentError.new('Hey')
end
rescue Sequel::DatabaseError => e
raise e.wrapped_exception
end