Обработка ошибок в PHP - PullRequest
1 голос
/ 07 мая 2010

У меня есть собственный класс, который при вызове перенаправляет на страницу и отправляет переменные «message_type» и «message» через GET. Когда страница открывается, она проверяет эти переменные и отображает сообщение «success», «warning» или «error» в зависимости от переменной «message_type». Я сделал так, чтобы пользователь думал, что они остаются на той же странице. Это также позволяет передавать другие переменные вместе с сообщением.

Это хорошая практика, или я должен просто начать использовать исключения?

Пример:

//Call a static function that will redirect to a page, with an error message
RedirectWithMessage::go('somepage.php', MessageType::ERROR, 'Error message here.');

Следующая функция checkMessage () является включаемым файлом:

function checkMessage()
{
    if((isset($_GET['message_type']) && strlen($_GET['message_type'])) && (isset($_GET['message']) && strlen($_GET['message_type'])))
    {
        DisplayMessage::display($_GET['message_type'], $_GET['message']);
        return true;
    }
    return false;
}

На перенаправленной странице вызовите checkMessage ();

//If a message is received, display it. If not, do nothing
checkMessage();

Я знаю, что это может быть расплывчато, и я могу предоставить больше кода при необходимости. Я предполагаю, что проблема в том, что у меня нет большого опыта использования исключений, но я думаю, что они кажутся громоздкими (писать блоки try-catch везде). Пожалуйста, дайте мне знать, если я затрудняю это для себя или есть лучшее решение.

Спасибо! Mike

Ответы [ 6 ]

1 голос
/ 07 мая 2010

Ошибки и исключения не полностью совпадают. Исключениями являются ошибки, которые являются «исключительными» обстоятельствами, такими как невозможность подключения к базе данных, невозможность связи с внешним ресурсом или, возможно, запись пользователя, которую вы считаете исключением, что приводит к остановке приложения.

Учитывая, что, используя исключения, вы можете реализовать всплывающее сообщение об ошибке в ваших моделях / бизнес-объектах и ​​просто перехватить ошибку как можно выше в стеке вызовов (в идеале на контроллере или главной странице, если вы не используете шаблон MVC). Если вы хотите отправить сообщение напрямую, это нормально, но вы можете просто использовать коды ошибок, чтобы вы могли просто создать объект или массив ошибок с соответствующими сообщениями или даже поддерживать локализацию или варианты сообщений с той же ошибкой. После того, как вы поймали ошибку как исключение, вы можете затем поместить ее в переменную и просто отобразить в шаблоне или в представлении или выполнить перенаправление на страницу с обычным сообщением.

<?php
  class SampleModel
  {
      public function validate($params)
      {
           if (!is_array($params)) {
                 throw new Exception("Input provided is not valid");
           }
           //add as many validations as you want.
           return TRUE;
      }  
  }
 ?> 

Использование:

<?php
      $model = new SampleModel();
      $input = "not an array"; 
      $msg = null;       
      $msgtype = null; 
      try {       
          $result = $model->validate($input); //this will throw a user-defined exception because we are passing a string instead of an array
          if ($result) {
              $msgtype = "success"; 
              $msg = "Successful validation";
          }

      } catch(Exception $e) {
          $msg = $e->getMessage();
          $msgtype = "Fatal error";  
      }

      RedirectWithMessage::go('somepage.php', $msgtype, $msg);

Если вам абсолютно не нужно перенаправлять, просто загрузите другой набор шаблонов страниц для типа ошибки.

      //load the appropriate template/view class. You need to create this class or use a framework.
      LoadWithMessage::display('sometemplate.inc.php', $msgtype, $msg); 

Пример кода выше обычно является контроллером.

Кроме того, для $ _SESSION существует дополнительная нагрузка на производительность, не говоря уже о дополнительной задержке после того, как вы распределитесь (если вы ожидаете, что ваше приложение будет большим). Я бы не советовал использовать его для сообщений об ошибках. Обычно я просто использую его для сохранения данных. Сообщения об ошибках не предназначены для сохранения, и сеть по своей природе не имеет состояния.

1 голос
/ 07 мая 2010

Я думаю, что это хороший способ сделать это, я делаю что-то очень похожее, хотя вместо этого храню соответствующую информацию об ошибках в их сеансе ($_SESSION) и очищаю ее сразу после ее отображения. Это удерживает его от строки запроса и делает так, что если они обновляют страницу, ошибка исчезает

0 голосов
/ 07 мая 2010

Хранить все сообщения как в массиве в сеансе. этот класс может помочь вам узнать, как это сделать http://flourishlib.com/browser/fMessaging.php

0 голосов
/ 07 мая 2010

Во-первых, похоже, что ваша бизнес-логика может быть привязана к страницам PHP, на которых она выполняется, и поэтому, если вы хотите использовать некоторые из них в другом контексте, вы можете столкнуться, поскольку вы застряли с при перенаправлении на определенную страницу при ошибке.

Если бы вы использовали исключения, у вас был бы выбор: немедленно перехватить эту ошибку и продолжить или позволить ей обработать ее выше (например, отказаться и показать страницу ошибки пользователю).

0 голосов
/ 07 мая 2010

Я часто использую проверку 'if', потому что я никогда не понимал процесс try / catch.Мне также нравится идея поместить ошибку в $ _SESSION.

0 голосов
/ 07 мая 2010

Я не уверен, что блоки исключений и Try / Catch подходят, но вы можете создавать сообщения об успехе или ошибках на одной странице без необходимости перенаправления на другую страницу.

Кроме того, эта корректировка вашего условия IF немного легче для чтения и должна достигать тех же результатов:

if(!empty($_GET['message_type']) && !empty($_GET['message']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...