Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby Sequel事务包装异常,而不是重新启动异常_Ruby_Transactions_Sequel - Fatal编程技术网

Ruby 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_

在Sequel中使用事务时,您应该能够引发异常并使其从事务块中冒泡出来

从Sequel文档中:

如果引发任何其他异常,则回滚事务,并在块外引发异常:

然而,我似乎无法捕捉到
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