如何捕获这个嵌套异常?

时间:2009-12-28 15:54:39

标签: php

示例:我使用抛出异常的PDO方法。但是在try块中,如果出现其他问题,我也会抛出自己的异常。现在我想分别处理PDOException和我自己的Exception。我怎么能把它分开来让它起作用?

   public function prepare(string $sql, array $params) {
    try {
        $prepared = $this->dbh->prepare($sql); // may throw PDOException
        $i = 1;
        foreach ($params as $param) {
        $ok = $prepared->bindParam($i, $param);
        if (!$ok) {
            throw new Exception("Unable to bind parameter (" . $param . ") to prepared statement: " . $sql);
        }
        $i++;
        }
    } catch (PDOException $e) {
        throw new Exception("DB:prepare(): Could not prepare statement. " . $e->getMessage());
    }
    return $prepared;
   }

请注意,我有一个全局错误处理程序,负责记录文件的任何异常。这就是为什么我抛出自己的异常而不是直接写入日志文件(这样,我也得到了回溯)。

2 个答案:

答案 0 :(得分:7)

您可以使用多个catch块,如下所示:

try {
    // ...
} catch (PDOException $e) {
    // Handle the PDOException, with some specific code
} catch (Exception $e) {
    // Handle any other kind of Exception 
    // that has not already been catched by 
    // one of the previous(es) catch block
}

但请注意,您必须首先使用“最具体”的例外类型 - 这意味着Exception必须是最后一个。


以下是一些您可能感兴趣的文章/博客文章,关于异常和PHP:

答案 1 :(得分:1)

多个catch es?或者仅捕获Exception并检查其类型。