【问题标题】:PHP does not throw exception if mysqli is not enabled如果未启用 mysqli,PHP 不会抛出异常
【发布时间】:2016-12-14 18:03:31
【问题描述】:

我有

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once "configuration.php";
header('Content-Type: application/json');
try
{   
    $mysqli = new mysqli(MYSQL_SERVER, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE);
    $mysqli->set_charset("utf8");
} catch (Exception $e) {
    echo json_encode(
        array(
            'msg' => $e->getMessage()
        )
    );
}

如果 mysqli 未启用,则它不会捕获错误:

致命错误:未捕获的错误:在 C:\test\db_connect.php:8 中找不到类 'mysqli'
堆栈跟踪:
#0 C:\test\getContacts.php(2): require_once()
#1 {main} 在 8

行的 C:\test\db_connect.php 中抛出

我该怎么做才能捕捉到错误?

我试过这个但是没用:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once "configuration.php";
header('Content-Type: application/json');
try
{
    if(!extension_loaded('mysqli'))
    {
        throw new Exception('mysqli is not enabled');
    }

    $mysqli = new mysqli(MYSQL_SERVER, MYSQL_USERNAME, MYSQL_PASSWORD, MYSQL_DATABASE);
    $mysqli->set_charset("utf8");
} catch (Exception $e) {
    echo json_encode(
        array(
            'msg' => $e->getMessage()
        )
    );
}

这个没有停止,继续执行脚本。

{"msg":"mysqli is not enabled"}
注意:未定义变量:mysqli in C:\test\getContacts.php行99

致命错误:未捕获的错误:在 C:\test\getContacts.php:99 中的 null 上调用成员函数 query() 堆栈跟踪: #0 {主要} 在 99

行的 C:\test\getContacts.php 中抛出

【问题讨论】:

  • mysqli 不会抛出异常,除非您明确启用它们。如果连接失败,它甚至不会抛出一个。你总是得到一个mysqli对象,并且必须明确检查$mysqli-&gt;connect_error。致命错误不是例外。它们是与对象或异常无关的 php 级错误。他们不能被“抓住”,因为他们一开始就没有被“扔”。
  • "This one does not halt, continues to execute the script" 那是因为您捕获了异常 - 这是预期的行为。如果要在捕获异常后停止执行,请使用die()exit
  • 您认为它继续执行的错误消息 - 这不是相同的代码。它正在为未定义的变量$mysqli 发出E_NOTICE,但您正在那里创建该变量,然后在query() 调用中出现致命错误,但您没有调用query() .此处未发布的其他一些代码对您抛出的异常后的错误负责。如果你想停止未来的执行,你需要在你的catch {} 中明确地exit()
  • "Uncaught Error" 在迁移到 PHP 7 时暗示 catch (\Throwable $e)

标签: php mysqli php-7


【解决方案1】:

很奇怪,它不会被安装,但如果你自己滚动,我想它可以被省略。我会检查程序功能是否存在

if(!function_exists('mysqli_connect')) {
    throw new Exception('mysqli is not enabled');
}

【讨论】:

  • php-mysql 扩展不包含在默认安装中,必须显式安装,否则 mysqli_* 功能不可用。当然,如果您使用的是像 lamp/wamp/mamp 堆栈这样的包,也有例外。但是一个简单的apt-get install php/yum install php 不会包含它。
【解决方案2】:

由于问题标记为 php-7:可以捕获 php 7 中的错误,但它不继承自 Exception,因此您必须以不同的方式捕获它们:

...
} catch (Error $e) {
         ^^^^^ Not Exception
    echo json_encode(
        array(
            'msg' => $e->getMessage()
        )
    );
    // stop execution
    exit;
}

有关error handling in php 7的更多信息,请参阅手册。

【讨论】:

    猜你喜欢
    • 2012-04-08
    • 2011-09-04
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多