Bueno, la respuesta frípata es que la especificación del idioma lo prohíbe.
Pero retrocedamos un poco y piénselo de otra manera, ¿qué pasa si podría hacer esto?
try {
foo();
}
bar();
catch (Exception e) {
baz();
}
¿Cuál podría ser la semántica de esto? Si detectamos una excepción en foo()
, ¿se llama baz()
? ¿Qué hay de bar()
?Si bar()
arroja, ¿captamos la excepción en ese caso?
Si excepciones en bar()
son no capturados, y excepción en foo()
impiden bar()
de funcionamiento, entonces el constructo es equivalente a:
try {
foo();
} catch (Exception e) {
baz();
}
bar();
Si excepciones en bar()
son capturados, y excepción en foo()
evitar que se ejecute bar()
, entonces la construcción es equivalente a:
try {
foo();
bar();
} catch (Exception e) {
baz();
}
Si excepciones en bar()
son no capturados, y la excepción en foo()
No evitar bar()
se ejecute (bar()
siempre se ejecuta), entonces la construcción es equivalente a:
try {
foo();
} catch (Exception e) {
baz();
} finally {
bar();
}
Como se puede ver , cualquier semántica razonable para esta construcción entre-prueba-captura ya se puede expresar sin la necesidad de una construcción nueva, y bastante confusa. Es difícil idear un significado para esta construcción que no sea redundante.
Como acotación al margen, una razón potencial que no podemos hacer:
try {
foo();
} finally {
bar();
} catch (Exception e) {
baz();
}
podría ser que no refleja el orden de ejecución real - bloques catch se ejecutan antes el bloque finally. Esto permite que los bloques catch utilicen los recursos que el bloque finally pueda liberar más tarde (por ejemplo, para solicitar información de diagnóstico adicional de un objeto RPC o algo así). ¿Podría hacerse que funcione también para el otro lado? Por supuesto. ¿Vale la pena? Probablemente no.
Tu respuesta a la primera pregunta es incorrecta. El compilador no va a pensar que no hay un bloque 'catch'. Obviamente sigue ahí en su código, y el hecho de que luego viene justo después del bloque 'finally' causará un error en tiempo de compilación. – BoltClock
BoltClock es correcto, se obtiene un error de compilación en su primera pregunta. * catch * debe estar precedido inmediatamente por * try * – StuartLC
El bloque catch debe estar sintácticamente inmediatamente después del bloque try. No hay otras razones – Sabbath