On Wed, 18 Dec 2019 at 21:45, Denis Kudriashov <dionisiydk@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.
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.
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