代码之家  ›  专栏  ›  技术社区  ›  DevelJoe

PHP异常类中的反向级联?

  •  1
  • DevelJoe  · 技术社区  · 2 年前

    我只是想再次检查一下,我刚刚发现的是不是默认的PHP行为,因为我无法解释它。假设您构建了一个定制的PHP异常类:

    <?php
    namespace XYZ;
    
    if ( ! class_exists( 'XYZ\CustomException' ) ) {
    
      class CustomException extends \Exception {
    
        public function __construct( int $code ) {
    
            parent::__construct( "The error code is: $code", $code );
    
        }
    
      }
    
    }
    ?>
    

    然后启动一个PHP脚本,其内容如下:

    try {
      throw new CustomException(1);
    } catch ( \Exception $e ) {
      echo "regular exception thrown";
    } catch ( CustomException $e ) {
      echo "custom exception thrown";
    }
    

    当我跑那个街区的时候 "regular exception thrown" .

    当我将脚本的catch块反转为:

    try {
      throw new CustomException(1);
    } catch ( CustomException $e ) {
      echo "custom exception thrown";
    } catch ( \Exception $e ) {
      echo "regular exception thrown";
    } 
    

    我明白了 "custom exception thrown" .

    PHP中的子类 Exception 班级将被家长抓到 例外 处理程序,如果父级 例外 类捕获块是先写的吗??或者这是一种不寻常的奇怪配置?

    2 回复  |  直到 2 年前
        1
  •  2
  •   Barmar    2 年前

    当抛出异常时,它将通过 try 按顺序块,测试异常是否是指定类的实例,并在到达第一个匹配块时停止。自从 CustomException Exception 这个 catch ( \Exception ) 块匹配这个测试,所以它首先停止。

    基本上就像:

    if (is_a($e, 'Exception')) {
        echo "regular exception thrown";
    } elseif (is_a($e, 'CustomException')) {
        echo "custom exception thrown";
    }
    

    它不会试图找到 catch 用最接近的匹配块,它只是按顺序完成。你有责任根据具体情况来订购。

    这个 documentation 解释如下:

    第一个 接住 阻止与抛出对象类型匹配的抛出异常或错误遭遇将处理该对象。

        2
  •  1
  •   Guido Faecke    2 年前

    这是正常的行为。自从你 CustomException 是继承 Exception 你的第一次呢 catch 反对 例外 它会先停在这里。