无法使用 try-catch 处理 SQL 异常 [重复]

Posted

技术标签:

【中文标题】无法使用 try-catch 处理 SQL 异常 [重复]【英文标题】:Can't handle SQL exception with try-catch [duplicate] 【发布时间】:2014-01-18 22:48:19 【问题描述】:

我正在创建相当大的导入脚本。我想查看任何有问题的(未执行的)SQL 查询。我在使用 try-catch php 块捕获错误的 SQL 查询时遇到问题。

我有一个问题:

SELECT id FROM tag WHERE name IN ()

当然有一个错误,所以我想用这段代码打印这样的查询:

$sql = "SELECT id FROM tag WHERE name ".$tagsSql."";

try

    $query = mysqli_query($this->mysqli, $sql);
    $result = $query->fetch_assoc();

catch(Exception $e)

    echo 'Problem with: '.$sql;
    print_r($e); die;

运行脚本时,PHP 会抛出这个:

Fatal error: Call to a member function fetch_assoc() on a non-object in C:\www\blackboard-import\index.php on line 227

为什么没有捕捉到这个错误?因为它是致命的?我该如何处理这种情况? 我使用mysqli来联系MySQL。

【问题讨论】:

【参考方案1】:

这不是常规异常,而是致命错误(导致 PHP 关闭)。 mysqli_query() 将在错误时返回 false,这就是您当前脚本失败的原因,因此解决方案可能类似于以下内容

try 
    $query = $this->msqli->query($sql);
    if ($query === FALSE) 
        throw new Exception($this->mysqli->error);
    

    $result = $query->fetch_assoc();
 catch(Exception $e) 
    //...

【讨论】:

以上是关于无法使用 try-catch 处理 SQL 异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JAVA——异常Throwable抛出异常Throws异常处理try-catch制造异常Throw自定义异常类

Java异常处理只有Try-Catch吗?

try-catch的使用以及细节

try-catch异常处理

异常-笔记-01

C#中如何处理异常?怎么使用try-catch语句?