mysql PHP & WP:当数据库抛出错误时,try catch不起作用

jq6vz3qz  于 2024-01-05  发布在  Mysql
关注(0)|答案(3)|浏览(284)

我目前正在尝试为以下情况编写错误处理。我希望能够在数据库为--read-only并尝试写入时捕获错误。
WordPress数据库错误WordPress数据库错误
抛出此错误是因为数据库是--read-only,并且正在尝试写入数据库。但是,此错误应该已被我的catch条件捕获。

  1. function drools_request($data, $uid) {
  2. try {
  3. $db = _get_db();
  4. $db->insert("requests", [
  5. "uid" => $uid,
  6. "data" => json_encode($data),
  7. ]);
  8. }
  9. catch(Error $e){
  10. echo 'Error writing to database: ', $e->getMessage(), "\n";
  11. }
  12. }

字符串
正如你从上面的代码片段中看到的,$db->insert(方法正确地中断了,因为它试图写入一个--read-only$db示例。但是,catch(Error $e)没有工作,为什么?
以下是完整的类:

  1. <?php
  2. namespace StatCollector;
  3. function drools_request($data, $uid) {
  4. try {
  5. $db = _get_db();
  6. $db->insert("requests", [
  7. "uid" => $uid,
  8. "data" => json_encode($data),
  9. ]);
  10. }
  11. catch(Exception $e)
  12. {
  13. echo 'Error writing to database: ', $e->getMessage(), "\n";
  14. }
  15. }
  16. function drools_response($response, $uid) {
  17. try {
  18. $db = _get_db();
  19. $db->insert("responses", [
  20. "uid" => $uid,
  21. "data" => json_encode($response),
  22. ]);
  23. }
  24. catch(Exception $e)
  25. {
  26. echo 'Error writing to database: ', $e->getMessage(), "\n";
  27. }
  28. }
  29. function results_sent($type, $to, $uid, $url = null, $message = null) {
  30. try {
  31. $db = _get_db();
  32. $db->insert("messages", [
  33. "uid" => $uid,
  34. "msg_type" => strtolower($type),
  35. "address" => $to,
  36. "url" => $url,
  37. "message" => $message
  38. ]);
  39. }
  40. catch(Exception $e)
  41. {
  42. echo 'Error writing to database: ', $e->getMessage(), "\n";
  43. }
  44. }
  45. function peu_data($staff, $client, $uid) {
  46. try {
  47. if (empty($uid)) {
  48. return;
  49. }
  50. $db = _get_db();
  51. if (! empty($staff)) {
  52. $db->insert("peu_staff", [
  53. "uid" => $uid,
  54. "data" => json_encode($staff)
  55. ]);
  56. }
  57. if (! empty($client)) {
  58. $db->insert("peu_client", [
  59. "uid" => $uid,
  60. "data" => json_encode($client)
  61. ]);
  62. }
  63. }
  64. catch(Exception $e)
  65. {
  66. echo 'Error writing to databse: ', $e->getMessage(), "\n";
  67. }
  68. }
  69. function response_update() {
  70. $uid = $_POST['GUID'];
  71. $url = $_POST['url'];
  72. $programs = $_POST['programs'];
  73. if (empty($uid) || empty($url) || empty($programs)) {
  74. wp_send_json(["status" => "fail","message" => "missing values"]);
  75. return wp_die();
  76. }
  77. try {
  78. $db = _get_db();
  79. $db->insert("response_update", [
  80. "uid" => $uid,
  81. "url" => $url,
  82. "program_codes" => $programs
  83. ]);
  84. wp_send_json(["status" => "ok"]);
  85. wp_die();
  86. }
  87. catch(Exception $e)
  88. {
  89. echo 'Error writing to database: ', $e->getMessage(), "\n";
  90. }
  91. }


为什么trycatch不工作?我能做些什么来解决这个问题?这篇文章没有工作。PHP try/catch and fatal error

o4tp2gmn

o4tp2gmn1#

您的代码位于自定义命名空间中:

  1. namespace StatCollector;

字符串
所以这段代码:

  1. catch (Exception $ex)


正在寻找\StatCollector\Exception的异常类,这不是抛出的:\Exception是。
由于ErrorException类位于 root 命名空间中,因此需要执行以下操作:

  1. catch (\Exception $ex)


和/或:

  1. catch (\Error $ex)


或者只是:

  1. catch (\Throwable $t)


然后也遵循上面的Bill Karwin's建议。

展开查看全部
j5fpnvbx

j5fpnvbx2#

在PHP中,ErrorException都实现了Throwable接口,但Error不是Exception的子类。
您需要用途:

  1. 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对象,在某些情况下,只有当你告诉方法这样做时。

vof42yt1

vof42yt13#

您可以添加下面的语句来解决此问题:
mysqli_report(MYSQLI_REPORT_ERROR)|MYSQLI_REPORT_STRICT);
请确保在使用mysqli建立数据库连接之前添加上述语句。

相关问题