如何引发PDO异常?

6

这段代码运行良好,但如果出现任何错误,我希望能够处理异常,因此我故意在查询中制造了一个语法错误,但是什么也没发生。以下是代码:

try {
    $sql = "INSERT INTO journals (topic, author, ) VALUES ('$topic', '$authors', ')";
    echo "1st";
    $lecturers_db->query($sql);
    echo "second";
} catch(PDOException $e) {
    echo $e->getMessage();
    echo $msg = "Error!";
} 

没有明显的语法错误,代码可以正常运行。但是有语法错误时,什么也不会发生,try块中的所有代码都会执行,而catch块中的代码永远不会执行。

我想要引发一个异常,请问我应该如何做?感谢任何帮助。

2个回答

9

一定要在初始化pdo对象时,将属性PDO::ATTR_ERRMODE设置为PDO::ERRMODE_EXCEPTION

$lecturers_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

之后,任何失败的查询都会引发异常。


1
你也可以将这个作为第四个参数传递给构造函数:array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)(以及其他可能的配置选项)。 - Decent Dabbler
1
@Chibuzo 很高兴能帮到你 :) 如果这个回答有用,请不要忘记将其标记为已解决,干杯! - marcelog

7

代码中的语法错误不等同于异常。发生异常时会抛出异常。

<?php 
    try {
        $code = 12;
        throw new PDOException('Message', $code );
    } catch (PDOException $e) {

    }
?>

然而,从手册中可以看到:

你不应该在自己的代码中抛出 PDOException。关于 PHP 中的异常信息,请参见 异常。

我的建议是要么抛出一般性异常,要么编写自定义异常以处理错误。


非常感谢您的输入,我会按照您提供的链接进行操作。 - Chibuzo
你误解了OP的问题。他在谈论SQL语句中的语法错误。我也需要再读一遍才能理解。 - Decent Dabbler
@fireeyedboy,是的,我在阅读marcelog的回答后注意到了这一点。感谢你指出来。 - Jeff Lambert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接