I hate/love this so much.
To the list it goes.
I hate/love this so much.
To the list it goes.
Fantastic thread
To expand on this, another angle is that without else rethrow(), Julia’s bare catch “falls back” to continuing after a if-elseif exception type block. One could argue this is equally valid default behavior, like returning nothing for the “cursed” sqrt_second, but PEP8 argues:
A bare
except:clause will catch SystemExit and KeyboardInterrupt exceptions, making it harder to interrupt a program with Control-C, and can disguise other problems. If you want to catch all exceptions that signal program errors, useexcept Exception:(bare except is equivalent toexcept BaseException:).
To explain BaseException, PEP352 introduced another layer of hierarchy to separate some lower-level exceptions from the run-of-the-mill Exception superclass in case the user does want generic handling of the latter; I wouldn’t call except Exception: default behavior because a subset is specified. I don’t know if there’s something similar in Julia, but we wouldn’t need to change our flatter Exception hierarchy with an extra defined supertype because we have Union.
BaseException # Julia’s equivalent is just called Exception
├── BaseExceptionGroup
├── GeneratorExit
├── KeyboardInterrupt
├── SystemExit
└── Exception
… …├── …
I personally agree that Control-C should simply stop the program unless InterruptException is specifically handled, so rethrowing makes more sense as a default behavior for caught exceptions over continuing. Here’s an example where the InterruptException gets caught and risks continuing:
function foo(t=3.0) # t gives time to Control-C
try
sleep(t) # Control-C gets caught
div(1,0)
catch
println("catching...")
sleep(t) # now Control-C stops the program
end
"foo end"
end