PHP 尝试/捕获和致命错误

2022-08-30 15:07:47

我使用以下脚本来使用PHP的数据库:

try{
    $db = new PDO('mysql:host='.$host.';port='.$port.';dbname='.$db, $user, $pass, $options);
}
catch(Exception $e){
    $GLOBALS['errors'][] = $e;
}

现在,我想使用此数据库句柄通过以下代码执行请求:

try{
    $query = $db->prepare("INSERT INTO users (...) VALUES (...);");
    $query->execute(array(
        '...' => $...,
        '...' => $...
    ));
}
catch(Exception $e){
    $GLOBALS['errors'][] = $e;
}

这是问题所在:

  • 当与DB的连接正常时,一切正常,
  • 当连接失败但我不使用数据库时,我有数组并且脚本之后仍在运行,$GLOBALS['errors'][]
  • 当与数据库的连接失败时,我收到以下致命错误:

注意:未定义的变量:C中的db:\xampp\htdocs[...]\test.php 在第 32 行

致命错误:在 C:\xampp\htdocs 中的非对象上调用成员函数 prepare() [...]\test.php 在第 32 行

注意:第 32 行是指令。$query = $db->prepare(...)

也就是说,脚本崩溃了,尝试/捕获似乎毫无用处。你知道为什么第二次尝试/捕获不起作用以及如何解决它吗?

感谢您的帮助!

编辑:有一些非常好的回答。我已经验证了一个不完全是我想做的,但这可能是最好的方法。


答案 1

try/catch块只适用于抛出的异常(或必须调用 的子类)。您无法使用 / 捕获致命错误。throw ExceptionExceptiontrycatch

如果无法建立数据库连接,我会认为这是致命的,因为您可能需要数据库在页面上执行任何有意义的操作。

PDO如果无法建立连接,将引发异常。您的具体问题是,当您尝试使用它调用方法时,没有定义该方法,因此您会得到一个致命的空指针(某种程度上)。与其像其他人建议的那样跳过箍,不如修复代码,以确保在需要时始终定义它,或者以一种不那么脆弱的方式确保数据库连接在使用它的代码中可用。$dbif ($db == null)$db

如果确实要“捕获”致命错误,请使用 ,但这仍会在出现致命错误时停止脚本执行。set_error_handler


答案 2

在 PHP7 中,我们现在可以使用尝试捕获简单工作的致命错误

try {
   do some thing evil
} catch (Error $e) {
   echo 'Now you can catch me!';
}

但通常,我们应该避免使用catch Error,因为它涉及错过属于程序员责任的代码:-)


推荐