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而不是异常。