没有抓住重新抛出异常

时间:2012-12-25 18:00:00

标签: php exception

我正在构建一个自定义异常类来管理所有异常:

class MyExceptions extends Exception
{
    public function __construct($message = 'Unkown errror', $code = -1, Exception $previous = null) {
        echo 'init!';
        parent::__construct($message, $code, $previous);
    }   
}

现在,当发生PDOException时,我想将其重新抛出到MyExceptions:

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!';             
        }
    }
}

问题是当数据库连接异常上升时,屏幕上出现以下致命错误:

init!
Fatal error: Uncaught exception 'MyExceptions' with message...

因此,虽然调用了MyExceptions __construct(),但未捕获异常(请参阅显示的'init!')。 我读到的每一点资源都指向我的确切实现,我不知道我做错了什么。

3 个答案:

答案 0 :(得分:3)

你需要

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中抛出的不同类型的异常。

答案 1 :(得分:1)

你扔了它:

throw new MyExceptions($e);
^^^^^

然后你没有抓住它。那你觉得怎么样?

此外,你应该在第三个位置(对于前一个)而不是第一个位置(对于消息)添加先前的异常。

答案 2 :(得分:1)

它没有通过所有的catch块。只有匹配的第一个。如果然后在catch块中抛出另一个异常,则必须在第一个块中的另一个try块中捕获它。