PHP & WP: попытаться поймать не работает, когда выдается ошибка из БД - PullRequest
2 голосов
/ 19 сентября 2019

В настоящее время я пытаюсь написать обработку ошибок для следующей ситуации.Я хочу быть в состоянии отловить ошибку, когда база данных --read-only и пытается записать.

Ошибка базы данных WordPress. Команда INSERT, запрещенная пользователю 'readonly' @

Эта ошибка выдается, потому что база данных --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( корректно прерывается, поскольку пытается записать в экземпляр $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 и фатальная ошибка

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Ваш код находится в пользовательском пространстве имен:

namespace StatCollector;

, поэтому этот код:

catch (Exception $ex)

ищет класс исключений \StatCollector\Exception, который не выбрасывается: \Exception is.

Поскольку классы Error и Exception находятся в пространстве имен root , необходимо выполнить:

catch (\Exception $ex)

и /или:

catch (\Error $ex)

или просто:

catch (\Throwable $t)

, а затем следуйте совету Билла Карвина выше.

1 голос
/ 19 сентября 2019

В PHP оба Ошибка и Исключение реализуют интерфейс Throwable, но Ошибка не является подклассом исключения.

Вам необходимо использовать:

catch(Exception $e) ...

Кроме того, вы должны знать, что коннекторы баз данных PHP, такие как PDO и Mysqli, по умолчанию не генерируют исключения.Вызывающее приложение должно включать исключения.

Wordpress не позволяет соединителю базы данных генерировать исключения.

В этом блоге приведены некоторые примеры обработки ошибок в Wordpress:

https://medium.com/the-metric/modern-wordpress-development-you-should-throw-an-exception-when-you-encounter-a-wp-error-81fb82275cbd

Методы WordPress, такие как wp_insert_user, не выдают исключения, когда они терпят неудачу, а вместо этого - и в некоторых случаях, только если вы указываете методу - возвращать объект WP_Error.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...