【发布时间】: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'
行的 C:\test\db_connect.php 中抛出
堆栈跟踪:
#0 C:\test\getContacts.php(2): require_once()
#1 {main} 在 8
我该怎么做才能捕捉到错误?
我试过这个但是没用:
<?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"}
行的 C:\test\getContacts.php 中抛出
注意:未定义变量:mysqli in C:\test\getContacts.php行99
致命错误:未捕获的错误:在 C:\test\getContacts.php:99 中的 null 上调用成员函数 query() 堆栈跟踪: #0 {主要} 在 99
【问题讨论】:
-
mysqli不会抛出异常,除非您明确启用它们。如果连接失败,它甚至不会抛出一个。你总是得到一个mysqli对象,并且必须明确检查$mysqli->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)。