PHP try、catch 优先级和继承

jrs*_*gtr 5 php

我想知道有关 PHP try,catch语句的一些事情。

让我们考虑以下示例。

abstract class ExceptionA extends Exception
{}

class ExceptionB extends ExceptionA
{}

class ExceptionTest
{
    public function example()
    {
        try {
            throw new ExceptionB();
        } catch ( ExceptionB $e ) {
            echo 'ExceptionB was caught';
        } catch ( ExceptionA $e ) {
            echo 'ExceptionA was caught';
        } catch ( Exception $e ) {
            echo 'Exception was caught';
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所有catch语句都匹配异常。其中第一个 ( ExceptionB) 是最接近的匹配。

陈述的顺序会catch影响到谁会抓住它吗?

Jet*_*eto 8

根据手册

当抛出异常时,该语句后面的代码将不会被执行,并且 PHP 将尝试查找第一个匹配的 catch 块

您可以轻松确认:

先抓ExceptionB

class ExceptionTest
{
    public function example()
    {
        try {
            throw new ExceptionB();
        } catch (ExceptionB $e) {
            echo 'ExceptionB was caught';
        } catch (ExceptionA $e) {
            echo 'ExceptionA was caught';
        } catch (Exception $e) {
            echo 'Exception was caught';
        }
    }
}

(new ExceptionTest())->example();  // Exception B was caught
Run Code Online (Sandbox Code Playgroud)

演示: https: //3v4l.org/htgEg

ExceptionA先抓后抓ExceptionB

class ExceptionTest
{
    public function example()
    {
        try {
            throw new ExceptionB();
        } catch (ExceptionA $e) {
            echo 'ExceptionA was caught';
        } catch (ExceptionB $e) {
            echo 'ExceptionB was caught';
        } catch (Exception $e) {
            echo 'Exception was caught';
        }
    }
}

(new ExceptionTest())->example();  // Exception A was caught
Run Code Online (Sandbox Code Playgroud)

演示: https: //3v4l.org/J7Xul