2014-02-06 2 views
0

При использовании транзакций в Sequel вы должны иметь возможность поднять исключение и вывести его из блока транзакций.Последовательные транзакции обертывают исключения вместо их ререйзинга

Из документации Sequel:

Если какое-либо другое исключение возникает, транзакция откатывается, и возбуждается исключение вне блока:

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 

Как я могу решить эту проблему?

+0

Будет ли это работать? 'puts e.message ['ArgumentError'] == 'ArgumentError'' –

+0

Да, но это хаки, и если исключение является частью глубокой иерархии, оно испортило поток исключений, поэтому я предпочел бы избежать такого решения. – Seralize

+0

Затем 'puts e.message == 'Hey''? должен работать тогда. Это поможет вам понять, откуда происходит ошибка. –

ответ

1

Вы можете попробовать использовать wrapped_exception как задокументировано here и переподнять исключение.

begin 
    DB.transaction do 
    raise ArgumentError.new('Hey') 
    end 
rescue Sequel::DatabaseError => e 
    raise e.wrapped_exception 
end 
Смежные вопросы