Php 重新抛出异常不会被捕获
我正在构建一个自定义异常类来管理所有异常:Php 重新抛出异常不会被捕获,php,exception,Php,Exception,我正在构建一个自定义异常类来管理所有异常: class MyExceptions extends Exception { public function __construct($message = 'Unkown errror', $code = -1, Exception $previous = null) { echo 'init!'; parent::__construct($message, $code, $previous); }
class MyExceptions extends Exception
{
public function __construct($message = 'Unkown errror', $code = -1, Exception $previous = null) {
echo 'init!';
parent::__construct($message, $code, $previous);
}
}
class myDB
{
private $db;
public function dbConnect() {
try {
$this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
}
catch (PDOException $e) {
throw new MyExceptions($e);
}
/* Updated */
catch (MyExceptions $e) {
echo 'caught!';
}
}
}
现在,当发生PDO异常时,我想将其重新抛出到MyExceptions:
class MyExceptions extends Exception
{
public function __construct($message = 'Unkown errror', $code = -1, Exception $previous = null) {
echo 'init!';
parent::__construct($message, $code, $previous);
}
}
class myDB
{
private $db;
public function dbConnect() {
try {
$this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
}
catch (PDOException $e) {
throw new MyExceptions($e);
}
/* Updated */
catch (MyExceptions $e) {
echo 'caught!';
}
}
}
问题是,当db连接异常出现时,屏幕上会出现以下致命错误:
init!
Fatal error: Uncaught exception 'MyExceptions' with message...
因此,虽然调用了MyExceptions__construct()(请参见显示的“init!”),但不会捕获异常。
我读到的每一点资源都指向与我一样的具体实现,我不知道我做错了什么。你在扔它:
throw new MyExceptions($e);
^^^^^
然后你就抓不到了。那你想知道什么
此外,您还应该在第三个位置(对于上一个位置)而不是第一个位置(对于消息)添加上一个异常。您正在抛出它:
throw new MyExceptions($e);
^^^^^
然后你就抓不到了。那你想知道什么
此外,您还应该在第三个位置(用于上一个位置)而不是第一个位置(用于消息)添加上一个异常。您需要
try {
try {
$this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
} catch (PDOException $e) {
throw new MyExceptions($e);
}
} catch (MyExceptions $f) {
echo 'caught!';
}
顺序catch块用于try中抛出的不同类型的异常。您需要
try {
try {
$this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
} catch (PDOException $e) {
throw new MyExceptions($e);
}
} catch (MyExceptions $f) {
echo 'caught!';
}
顺序catch块用于try中抛出的不同类型的异常。它不会遍历所有catch块。只有第一个匹配的。如果在catch块中抛出另一个异常,则必须在第一个异常块周围的另一个try块中捕获它。它不会遍历所有的catch块。只有第一个匹配的。如果随后在catch块中抛出另一个异常,则必须在第一个异常周围的另一个try块中捕获它。是否也捕获rethrown异常?如果它显示“with message…”,则调用exception::getMessage()时会发生什么情况在它上面?
catch
块只捕获前面try
块中的异常。您无法捕获从具有同级catch
块的catch
块抛出的异常。相反,您必须将其嵌套在另一个try
/catch
序列中。您是否也捕获了rethrown异常?如果它显示“with message…”,则在其上调用exception::getMessage()时会发生什么?catch
块仅捕获前一个try
块中的异常。您无法捕获从具有同级catch
块的catch
块抛出的异常。相反,您必须将它嵌套在另一个try
/catch
序列中。实际上,在复制/粘贴代码之前,我有一个catch(MyExceptions$e)
块。我现在就用它来编辑这个问题。如果你现在看一下代码,MyExceptions catch
就在那里。我还更新了抛出新的MyExceptions('message',0,$e)
。现在我有了致命错误:未捕获的异常“PDOException”和消息…
实际上,在复制/粘贴代码之前,我有一个捕获(MyExceptions$e)
块。我现在就用它来编辑这个问题。如果你现在看一下代码,MyExceptions catch
就在那里。我还更新了抛出新的MyExceptions('message',0,$e)
。现在我有了致命错误:未捕获的异常“PDOException”,消息是…
好的,现在就知道了!我错误地认为兄弟catch块可以将异常从一个抛出到另一个。谢谢菲利普@斯汀格斯:不,一点也不。但现在我明白你为什么问了。在这种情况下,您可能会寻找goto而不是异常。好的,现在就知道了!我错误地认为兄弟catch块可以将异常从一个抛出到另一个。谢谢菲利普@斯汀格斯:不,一点也不。但现在我明白你为什么问了。在这种情况下,您可能会寻找goto而不是异常。