Skip to main content
 首页 » 编程设计

ruby中后续事务包装异常而不是重新引发异常

2024年11月24日77pengyingh

在 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