在PHP中嵌套的try catch

Iqb*_*ary 5 php nested try-catch

考虑:

try{
    class MyException extends Exception{}
    try{
        throw new MyException;
    }
    catch(Exception $e){
        echo "1:";
        throw $e;
    }
    catch(MyException $e){
        echo "2:";
        throw $e;
    }
}
catch(Exception $e){
    echo get_class($e);
}
Run Code Online (Sandbox Code Playgroud)

我对此尝试和捕获感到困惑.我期待2:MyException结果,因为第二个try throw MyException.但实际结果是1:MyException.解释是什么?

小智 14

MyException延伸Exception,因此Exception更通用MyException,并且第一个catch块将捕获它.如果你想抓住MyException你需要扭转catch块的顺序:

class MyException extends Exception{}

try {
 try {
   throw new MyException;
 } catch(MyException $e){
   echo "2:";
   throw $e;
 } catch(Exception $e){
   echo "1:";
   throw $e;
 }
}catch(Exception $e){
echo get_class($e);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

第一个catch-block捕获了'Exception'类的所有内容.由于MyException扩展了Exception类,因此MyException会在第一个catch块中被捕获.