PHP中的嵌套try-catch

PHP中的嵌套try-catch,php,nested,try-catch,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(Excepti

考虑:

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);
}

我对这种尝试和捕捉感到困惑。我期待一个
2:MyException
结果,因为第二个
尝试抛出MyException
。但实际结果是
1:MyException
。解释是什么?

第一个catch块捕获“Exception”类的所有内容。由于您的MyException扩展了Exception类,MyException被捕获在此第一个catch块中。

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);
}

如果您检查类名并相应地处理它会更好

class MyException extends Exception {}

try {
    throw new MyException;
}
catch (Exception $ex){
    switch (get_class ($ex)) {

       case "MyException" :
           // Do whatever you want to do for MyException
           break;

       default:
           // Do whatever you want to do for Exception
           break;
   }
   throw $ex;
}

您应该使用主异常作为最后一个选项。因此,交换第一个和第二个捕捉块。