1

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

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!”),但不会捕获异常。我读到的每一点资源都指向我的确切实现,我不知道我做错了什么。

4

3 回答 3

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

于 2012-12-25T18:57:37.053 回答
1

你在扔它:

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

然后你没有抓住它。那么你想知道什么?

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

于 2012-12-25T18:06:27.227 回答
1

它不会遍历所有的 catch 块。只有第一个匹配。如果您随后在 catch 块中抛出另一个异常,则必须在第一个周围的另一个 try 块中捕获它。

于 2012-12-25T18:57:56.023 回答