On Monday, 30 January 2012 at 17:17:46 UTC, Andrej Mitrovic wrote:
On 1/30/12, Era Scarecrow <rtcv...@yahoo.com> wrote:
To me this seems like a mistake.
You could throw SpecialException in the handler for Exception.
So it's
legal code.
Yes, thanks to inheritance it is legal code. However it's almost
the same as this, which is legal code too.
try {
} catch (Throwable t) {
} catch {Exception e) { //never executed
} catch (StreamException st) { //never executed
} //and the list can go on forever.
See the problem? Everything that COULD be caught by exception is
now caught by throwable since it's inherited. At the very least
the compiler should warn you that certain sections won't be
executed, But then I would have to manually look up the
relationships when the compiler already knows them. In GCC known
code blocks that are never executed aren't even compiled in. If
the compiler reorders the blocks for you, the above would become
this.
try {
} catch (StreamException st) { //specific case
} catch {Exception e) { //less specific but no other inheritances
of this kind
} catch (Throwable t) { //everything else.
}