I'm OK with exception raising, but… there is code:

sequel -E sqlite:/  -c 'def foo; DB.transaction{DB.after_rollback { return 
:ar }; raise}; end; foo'
I, [2018-08-07T21:21:16.084229 #7520]  INFO -- : (0.000075s) PRAGMA 
foreign_keys = 1
I, [2018-08-07T21:21:16.084301 #7520]  INFO -- : (0.000013s) PRAGMA 
case_sensitive_like = 1
I, [2018-08-07T21:21:16.084577 #7520]  INFO -- : (0.000062s) SELECT 
sqlite_version()
I, [2018-08-07T21:21:16.084668 #7520]  INFO -- : (0.000028s) BEGIN
I, [2018-08-07T21:21:16.084785 #7520]  INFO -- : (0.000045s) ROLLBACK


And there is no exception.

On Tuesday, August 7, 2018 at 7:55:02 PM UTC+3, Jeremy Evans wrote:
>
> On Tuesday, August 7, 2018 at 8:14:10 AM UTC-7, Alexander Popov wrote:
>>
>> Hello!
>>
>> I see in the documentation of transactions that `Sequel::Rollback` 
>> exception will be suppressed without `reraise` option, and any another 
>> exception will not.
>>
>> But `Database#after_rollback` suppresses any exception, not only 
>> `Sequel::Rollback`.
>>
>
> Database#after_rollback does not suppress any exception:
>
> ruby bin/sequel -E sqlite:/  -c 'DB.transaction{DB.after_rollback{puts 
> :ar}; raise} rescue (p $!)'
> I, [2018-08-07T09:47:19.102175 #86248]  INFO -- : (0.000537s) PRAGMA 
> foreign_keys = 1
> I, [2018-08-07T09:47:19.102459 #86248]  INFO -- : (0.000096s) PRAGMA 
> case_sensitive_like = 1
> I, [2018-08-07T09:47:19.103353 #86248]  INFO -- : (0.000368s) SELECT 
> sqlite_version()
> I, [2018-08-07T09:47:19.103585 #86248]  INFO -- : (0.000059s) BEGIN
> I, [2018-08-07T09:47:19.103806 #86248]  INFO -- : (0.000039s) ROLLBACK
> ar
> RuntimeError
>
> Note how the RuntimeError raised inside the transaction block is not 
> supressed, and after_rollback is called.
>
> after_rollback is called in an ensure block after the transaction has been 
> rolled back, it does not rescue any exceptions.
>  
>
>> So, if I have some custom check in transaction and manual conditional 
>> `raise Sequel::Rollback unless valid?` with `after_rollback { return 
>> validation_errors }` — I'll not get any another exception like 
>> `Sequel::MassAssignmentRestriction`.
>>
>> Can be `Database#after_rollback` called only after `Sequel::Rollback` 
>> exception?
>>
>
> No, that wouldn't make sense.  after_rollback should be called after any 
> transaction rollback, regardless of the cause.
>
> If you want to handle conditional behavior in your after_rollback, you 
> could do:
>
> after_rollback { return validation_errors if !$! || 
> $!.is_a?(Sequel::Rollback) }
>
> $! will be nil in the case that Sequel::Rollback is suppressed.
>
> Thanks,
> Jeremy
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.

Reply via email to