PHP try/catch 和 fatal error

标签 php try-catch fatal-error

我正在使用以下脚本来使用 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;
}

问题来了:

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

Notice: Undefined variable: db in C:\xampp\htdocs[...]\test.php on line 32

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs[...]\test.php on line 32

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

也就是说,脚本崩溃了,try/catch 好像也没用了。你知道为什么第二次 try/catch 不起作用以及如何解决吗?

感谢您的帮助!

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

最佳答案

try/catch block 仅适用于抛出的异常(throw ExceptionException 的子类必须是称为)。您无法使用 try/catch 捕获 fatal error 。

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

如果无法建立连接,

PDO 将抛出异常。您的具体问题是 $db 在您尝试使用它调用方法时未定义,因此您得到一个致命的空指针(有点)。而不是像其他人建议的那样跳过 if ($db == null) 箍,你应该修复你的代码以确保 $db 在你需要它或者有一种不那么脆弱的方法来确保在使用它的代码中可以使用数据库连接。

如果您真的想“捕获” fatal error ,请使用 set_error_handler,但这仍然会停止脚本执行 fatal error 。

关于PHP try/catch 和 fatal error ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12928487/

相关文章:

php - 在 WordPress mysql 中创建新数据库时出现问题

java - 如何制作带有异常的三角形对象?

ios - Xcode 7 上的 Swift 发生 fatal error

ios - Swift PDFDocument 为文件和 url 返回 nil

php - 组注释不起作用

php - mysql从第一个表插入两个表id

php - Laravel 5 中公共(public) Assets 的本地路径是什么? (使用 server.php)

node.js - 如何为 fs.readFileSync() 捕获没有文件?

java - 如何正确提取在java中加载资源的简单try/catch block ?

swift - fatal error : swapping a location with itself is not supported with Swift 2. 0