estoy confundido por el siguiente código:confundido por esta excepción PHP try..catch anidación
class MyException extends Exception {}
class AnotherException extends MyException {}
class Foo {
public function something() {
print "throwing AnotherException\n";
throw new AnotherException();
}
public function somethingElse() {
print "throwing MyException\n";
throw new MyException();
}
}
$a = new Foo();
try {
try {
$a->something();
} catch(AnotherException $e) {
print "caught AnotherException\n";
$a->somethingElse();
} catch(MyException $e) {
print "caught MyException\n";
}
} catch(Exception $e) {
print "caught Exception\n";
}
Yo esperaría que esto de salida:
throwing AnotherException
caught AnotherException
throwing MyException
caught MyException
Pero en vez de eso da salida:
throwing AnotherException
caught AnotherException
throwing MyException
caught Exception
¿Alguien podría explicar por qué se "salta" la captura (MyException $ e)?
Gracias.
sólo quiero estar Seguro que estamos en la misma página ... Básicamente debería haber agregado otro 'try' después del primer' catch', ¿verdad? Entonces, como todo está incrustado en el intento mayor, ¿obtendría 3 conjuntos de excepciones? Básicamente, nunca atrapa la segunda excepción porque nunca lo intenta. – Anthony
Si, como alternativa, hubiera cambiado el 'catch' externo a" MyException "en lugar de a" Exception ", ¿hubiera capturado el 'throw' MyException? ¿El problema es que su intento desencadena el 'throw' de" MyException "pero debido a que el intento no fue iniciado por un' try', el 'catch' nunca ocurre? En otras palabras, ¿está "MyException" todavía por capturar ese tercer "catch"? – Anthony
@Anthony, re: Primer comentario: Sí, si agregó un tercer nivel de bloqueo de prueba, esa sería una solución. Un poco desordenado sin embargo. No elegiría caracterizar el problema como lo hizo en su última oración, pero no está * mal *. – Oddthinking