Hi Alistair

чт, 19 дек. 2019 г. в 07:19, Alistair Grant <akgrant0...@gmail.com>:

> On Wed, 18 Dec 2019 at 21:45, Denis Kudriashov <dionisi...@gmail.com>
> wrote:
> >
> > Following script demonstrates the difference in the error processing
> logic when there is an outer handler:
> >
> > [
> >
> > [MyTestError signal ] on: UnhandledError do: [ :e | self halt ]
> >
> >  ] on: MyTestError do: [ :z | z pass]
> >
> >
> > Try it from playground. Second line separately will show the halt while
> all together it will stop at MyTestError signal.
> >
> > Debugging shows that when the outer handler is processed it sets the
> handler context into the exception and it skips the existing handler for
> UnhandledError.
>
> It isn't skipping the UnhandledError handler.  MyTestError isn't a
> subclass of UnhandledError, it's a subclass of Error, so we expect the
> first exception handler that is triggered in the code above to be the
> MyTestError handler.
>

Hm. It forces me to think that I did not explain the problem.
If your sentence is correct then the following code would not halt:

[[MyTestError signal ] on: UnhandledError do: [ :e | self halt ]] fork


Notice that I use fork to avoid any "garbage" of outer handlers from the
doIt processing machinery.

With the handler we #pass the caught error (on: MyTestError do: [ :z | z
pass]) which should be equivalent to "not caught scenario" (it should be to
my view) but it doesn't (there will be MyTestError instead of halt).


> >
> > The question: is it a feature or a bug?
>
> Setting aside whether it is a feature or a bug, it is clearly the
> defined behaviour.
>

Do you still think it is clear semantics?


>
>
> > Think also how following code should work (unrelated to UnhandledError
> logic):
> >
> > [
> >
> > [ 1/0 ] on: MyTestError do: [ :e | self halt ]
> >
> >  ] on: ZeroDivide do: [ :z | MyTestError signal ]
>
> In this case the behaviour should be the same for both the browser and
> the playground: the 0 divide exception handler catches 1/0 and signals
> MyTestError, which doesn't have a handler, and a debugger is opened.
>
> Cheers,
> Alistair
>
>

Reply via email to