PHP & WP:当从 DB 抛出错误时,尝试 catch 不起作用
Posted
技术标签:
【中文标题】PHP & WP:当从 DB 抛出错误时,尝试 catch 不起作用【英文标题】:PHP & WP: try catch not working when error from DB is thrown 【发布时间】:2020-01-20 22:20:29 【问题描述】:我目前正在尝试为以下情况编写错误处理。我希望能够在数据库为 --read-only
并尝试写入时捕获错误。
WordPress 数据库错误 INSERT 命令拒绝用户 '只读'@
因为数据库是--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";
正如您从上面的 sn-p 中看到的,$db->insert(
方法正确地中断了,因为它试图写入 $db
实例,即--read-only
。但是,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
【问题讨论】:
查看这个答案***.com/a/27345492/4178487 如果您使用的是 WordPress 框架,那么我认为您应该这样标记问题。 【参考方案1】:您的代码位于自定义命名空间中:
namespace StatCollector;
所以这段代码:
catch (Exception $ex)
正在寻找 \StatCollector\Exception
的异常类,这不是抛出的:\Exception
是。
由于 Error
和 Exception
类位于 root 命名空间中,您需要这样做:
catch (\Exception $ex)
和/或:
catch (\Error $ex)
或者只是:
catch (\Throwable $t)
然后也按照上面的Bill Karwin's 建议。
【讨论】:
【参考方案2】:在 PHP 中,Error 和 Exception 都实现了 Throwable 接口,但 Error 不是 Exception 的子类。
你需要使用:
catch(Exception $e) ...
除此之外,您应该知道像 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
对象。
【讨论】:
这也不起作用 :(,我遵循这篇文章中的错误:***.com/questions/12928487/… 比尔,这还是不行 :( ***.com/questions/58031237/…以上是关于PHP & WP:当从 DB 抛出错误时,尝试 catch 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
WordPress 错误:调用未定义的函数 require_wp_db()
新安装 Wordpress 3.9 抛出错误:上传图像时“无法创建目录 wp-content/uploads/2014/09”
php FD-WP-迁移-DB-PRO-tweaks.php
php FD-WP-迁移-DB-PRO-tweaks.php
警告:mysqli_real_connect(): (HY000/2002): 第 1452 行的 /private/tmp/wordpress/wp-includes/wp-db.php 中没有这样
显示注意事项:未定义的属性:D:\wamp\www\wordpress-4.7.1\wordpress\wp-includes\wp-db.php 中的 wpdb::$insertid 第 684 行