【问题标题】:Why throws 'Caught Exceptionn' instead of 'Caught MyExceptionn' although I have the construct of the class?尽管我有类的构造,为什么要抛出“Caught Exception”而不是“Caught Exception”?
【发布时间】:2014-03-24 12:13:23
【问题描述】:
我有这个代码:
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";
}
当我在资源管理器中运行它时,输出是“Caught Exceptionn”而不是“Caught MyExceptionn”,尽管它是一个新的 MyException 并且我已经在这个类中构造了!!
【问题讨论】:
标签:
php
exception
throw
construct
【解决方案1】:
您的第一个catchblock 引用了异常,它是MyException 的父类。这意味着,如果您有 catch(Exception),它还将处理所有 MyException 和所有 Exception 类。
颠倒您的顺序以解决您的问题(即,使其从最具体到最通用):
class MyException extends Exception {}
function __construct($palabra){
echo 'hola.adios';
}
try {
throw new MyException('Oops!');
}catch (MyException $e) {
echo "Caught MyExceptionn";
}catch (Exception $e) {
echo "Caught Exceptionn";
}
【解决方案2】:
您应该将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";
}
如果异常是 MyException 类型,它将是第一个 catch 块中的 catched,如果不是,它将被更一般的 Exception catch 块捕获。