On Wed, 18 Dec 2019 at 23:32, Denis Kudriashov <dionisi...@gmail.com> wrote:
>
> Users of UnhandledError definitely shows that it is a critical bug.
>
> For example we rely on UnhandledError in Announcer to ensure that all 
> subscriptions will be processed independently on errors signalled by any of 
> them:
>
> ann := Announcer new.
> ann when: ValueChanged do: [:ann | 1 logCr. 1/0 ].
> ann when: ValueChanged do: [:ann | 2 logCr. 2/0 ].
> ann when: ValueChanged do: [:ann | 3 logCr. 3/0 ].
>
>
> ann announce: ValueChanged new
>
>
> It will show 1, 2, 3 in transcript and open 3 debuggers. Each error is 
> deferred to the background process allowing the delivery to continue:
>
> AnnouncementSubscription>>deliver: anAnnouncement
>
> " deliver an announcement to receiver. In case of failure, it will be handled 
> in separate process"
>
>
> ^ (self handlesAnnouncement: anAnnouncement ) ifTrue: [
>
> [action cull: anAnnouncement cull: announcer]
>
> on: UnhandledError fork: [:ex | ex pass ]]
>
>
> Now if you will try to wrap #announce: into handler block the deliver will be 
> interrupted by first error:
>
> [ann announce: ValueChanged new] on: ZeroDivide do: [ :err | err logCr. err 
> pass ].
>
>
> It will open single debugger at first handler error.

This looks like a bug in AnnouncementSubscription>>deliver:.  The
exception handler should probably be on Exception since the delivery
mechanism just wants to continue and let something else deal with the
exception.

Cheers,
Alistair

Reply via email to