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.