我目前正在尝试为以下情况编写错误处理。我希望能够在数据库为--read-only
并尝试写入时捕获错误。
WordPress数据库错误WordPress数据库错误
抛出此错误是因为数据库是--read-only
,并且正在尝试写入数据库。但是,此错误应该已被我的catch
条件捕获。
function drools_request($data, $uid) {
try {
$db = _get_db();
$db->insert("requests", [
"uid" => $uid,
"data" => json_encode($data),
]);
}
catch(Error $e){
echo 'Error writing to database: ', $e->getMessage(), "\n";
}
}
字符串
正如你从上面的代码片段中看到的,$db->insert(
方法正确地中断了,因为它试图写入一个--read-only
的$db
示例。但是,catch(Error $e)
没有工作,为什么?
以下是完整的类:
<?php
namespace StatCollector;
function drools_request($data, $uid) {
try {
$db = _get_db();
$db->insert("requests", [
"uid" => $uid,
"data" => json_encode($data),
]);
}
catch(Exception $e)
{
echo 'Error writing to database: ', $e->getMessage(), "\n";
}
}
function drools_response($response, $uid) {
try {
$db = _get_db();
$db->insert("responses", [
"uid" => $uid,
"data" => json_encode($response),
]);
}
catch(Exception $e)
{
echo 'Error writing to database: ', $e->getMessage(), "\n";
}
}
function results_sent($type, $to, $uid, $url = null, $message = null) {
try {
$db = _get_db();
$db->insert("messages", [
"uid" => $uid,
"msg_type" => strtolower($type),
"address" => $to,
"url" => $url,
"message" => $message
]);
}
catch(Exception $e)
{
echo 'Error writing to database: ', $e->getMessage(), "\n";
}
}
function peu_data($staff, $client, $uid) {
try {
if (empty($uid)) {
return;
}
$db = _get_db();
if (! empty($staff)) {
$db->insert("peu_staff", [
"uid" => $uid,
"data" => json_encode($staff)
]);
}
if (! empty($client)) {
$db->insert("peu_client", [
"uid" => $uid,
"data" => json_encode($client)
]);
}
}
catch(Exception $e)
{
echo 'Error writing to databse: ', $e->getMessage(), "\n";
}
}
function response_update() {
$uid = $_POST['GUID'];
$url = $_POST['url'];
$programs = $_POST['programs'];
if (empty($uid) || empty($url) || empty($programs)) {
wp_send_json(["status" => "fail","message" => "missing values"]);
return wp_die();
}
try {
$db = _get_db();
$db->insert("response_update", [
"uid" => $uid,
"url" => $url,
"program_codes" => $programs
]);
wp_send_json(["status" => "ok"]);
wp_die();
}
catch(Exception $e)
{
echo 'Error writing to database: ', $e->getMessage(), "\n";
}
}
型
为什么try
和catch
不工作?我能做些什么来解决这个问题?这篇文章没有工作。PHP try/catch and fatal error
3条答案
按热度按时间o4tp2gmn1#
您的代码位于自定义命名空间中:
字符串
所以这段代码:
型
正在寻找
\StatCollector\Exception
的异常类,这不是抛出的:\Exception
是。由于
Error
和Exception
类位于 root 命名空间中,因此需要执行以下操作:型
和/或:
型
或者只是:
型
然后也遵循上面的Bill Karwin's建议。
j5fpnvbx2#
在PHP中,Error和Exception都实现了Throwable接口,但Error不是Exception的子类。
您需要用途:
字符串
除此之外,你应该知道像PDO和Mysqli这样的PHP数据库连接器在默认情况下不会抛出异常。调用应用程序必须启用异常。
WordPress不允许数据库连接器抛出异常。
请参阅此博客以获得WordPress中错误处理的一些示例:
https://medium.com/the-metric/modern-wordpress-development-you-should-throw-an-exception-when-you-encounter-a-wp-error-81fb82275cbd的
像
wp_insert_user
这样的WordPress方法在失败时不会抛出异常,而是返回一个WP_Error
对象,在某些情况下,只有当你告诉方法这样做时。vof42yt13#
您可以添加下面的语句来解决此问题:
mysqli_report(MYSQLI_REPORT_ERROR)|MYSQLI_REPORT_STRICT);
请确保在使用mysqli建立数据库连接之前添加上述语句。