Php 为什么抛出';捕获异常n';而不是';捕获MyExceptionn';虽然我有这个班的结构?

Php 为什么抛出';捕获异常n';而不是';捕获MyExceptionn';虽然我有这个班的结构?,php,exception,throw,construct,Php,Exception,Throw,Construct,我有以下代码: class MyException extends Exception {} function __construct($palabra){ echo 'hola.adios'; } try { throw new MyException('Oops!'); }catch (Exception $e) { echo "Caught Exceptionn"; }catch (MyException $e) { echo "Caught MyExceptionn"; } 当我在

我有以下代码:

class MyException extends Exception {}

function __construct($palabra){
echo 'hola.adios';
}

try {
throw new MyException('Oops!');
}catch (Exception $e) {
echo "Caught Exceptionn";
}catch (MyException $e) {
echo "Caught MyExceptionn";
}

当我在资源管理器中运行它时,输出是“catch Exceptionn”,而不是“catch MyExceptionn”,尽管它是一个新的MyException,尽管我在这个类中构造了它

您的第一个catchblock引用了异常,它是MyException的父类。这意味着,如果您有catch(Exception),它还将处理所有MyException和所有异常类

颠倒顺序以解决问题(即从最具体到最一般):


您应该将
捕获
块从最具体到最不具体地进行链接。所以基本上,它应该看起来像

class MyException extends Exception {}

function __construct($palabra){
    echo 'hola.adios';
}

try {
    throw new MyException('Oops!');
} catch (MyException $e) {
    echo "Caught MyException";
} catch (Exception $e) {
    echo "Caught Exception";
}
如果异常类型为MyException,它将在第一个
catch
块中被捕获,如果不是,它将在更一般的
异常
catch
块中被捕获

class MyException extends Exception {}

function __construct($palabra){
    echo 'hola.adios';
}

try {
    throw new MyException('Oops!');
} catch (MyException $e) {
    echo "Caught MyException";
} catch (Exception $e) {
    echo "Caught Exception";
}