Sono confuso con il codice seguente:Confuso da questa eccezione PHP try..catch nidificazione
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";
}
mi si aspetterebbe che questo output:
throwing AnotherException
caught AnotherException
throwing MyException
caught MyException
Ma invece uscite:
throwing AnotherException
caught AnotherException
throwing MyException
caught Exception
Qualcuno potrebbe spiegare il motivo per cui "ignora" il rilevamento (MyException $ e)?
Grazie.
voglio solo essere certo siamo sulla stessa pagina ... In sostanza avrebbe dovuto aggiungere un altro 'try' dopo il primo' catch', giusto? Quindi, poiché l'intera cosa è incorporata nella prova più ampia, otterrebbe 3 serie di eccezioni? Essenzialmente non cattura mai la seconda eccezione perché non ci prova mai? – Anthony
Se, alternativamente, avesse cambiato il 'catch' esterno in" MyException "invece di" Exception ", questo avrebbe catturato il" lancio "di" MyException "? Il problema è che il suo tentativo innesca il lancio di "MyException" ma poiché il tentativo non è stato avviato da un 'try', il' catch' non succede mai? In altre parole, "MyException" è ancora là fuori per essere catturato da quel terzo "catch"? – Anthony
@Anthony, re: Primo commento: Sì, se ha aggiunto un terzo livello di blocco try che sarebbe una soluzione. Un po 'disordinato però. Non sceglierei di caratterizzare il problema come nella tua ultima frase, ma non è * sbagliato *. – Oddthinking