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";
  

为什么trycatch 不起作用?我能做些什么来解决这个问题?这个帖子没有用。 PHP try/catch and fatal error

【问题讨论】:

查看这个答案***.com/a/27345492/4178487 如果您使用的是 WordPress 框架,那么我认为您应该这样标记问题。 【参考方案1】:

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

namespace StatCollector;

所以这段代码:

catch (Exception $ex)

正在寻找 \StatCollector\Exception 的异常类,这不是抛出的:\Exception 是。

由于 ErrorException 类位于 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 行