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;
}
您应该使用主异常作为最后一个选项。因此,交换第一个和第二个捕捉块。