Я запутался следующий код:Смущенный этим PHP Exception try..catch вложенности
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";
}
Я ожидал бы это выход:
throwing AnotherException
caught AnotherException
throwing MyException
caught MyException
Но вместо этого он выводит:
throwing AnotherException
caught AnotherException
throwing MyException
caught Exception
Может ли кто-нибудь объяснить, почему он «пропускает» catch (MyException $ e)?
Спасибо.
Я просто хочу быть уверен, что мы на одной странице ... В принципе, он должен был добавить еще одну «попытку» после первого «улова», верно? Тогда, поскольку вся вещь встроена в большую попытку, он получит 3 набора исключений? По сути, он никогда не ловит второго исключения, потому что он никогда не пытается? – Anthony
Если бы он, наоборот, изменил внешний 'catch' на« MyException »вместо« Exception », это поймало бы« MyException »« throw »? Является ли проблема, что его попытка запускает «throw» из «MyException», но поскольку попытка не была инициирована «try», «catch» никогда не происходит? Другими словами, «MyException» все еще существует, чтобы попасть в этот третий «улов»? – Anthony
@ Anthony, re: Первый комментарий: Да, если бы он добавил третий уровень блока try, это было бы одним решением. Тем не менее, бит грязный. Я бы не стал характеризовать проблему, как у вас в последнем предложении, но это не так. – Oddthinking