被这个PHP异常混淆了try..catch嵌套

前端之家收集整理的这篇文章主要介绍了被这个PHP异常混淆了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)?

谢谢.

异常处理程序捕获其try块范围内的代码引发的异常.

对$a-> somethingElse()的调用不会发生在与跳过的异常处理程序相关联的try块中.它发生在另一个catch子句中.

只是因为它出现在物理下方,引发异常不足以使其覆盖该代码.

缩进括号的风格选择使这一点不那么清楚.即使它们是不相关的(兄弟姐妹)范围,上一个try块的关闭括号与下一个catch一样出现在同一行上.

原文链接:https://www.f2er.com/php/131320.html

猜你在找的PHP相关文章