Разделите ошибки PHP и ошибки приложений - PullRequest
2 голосов
/ 01 марта 2011

Я работаю над приложением, и возник вопрос.Я думал о том, чтобы оставить ошибки PHP побочными (они будут входить в базу данных или файл) и управлять другими ошибками (такими как «Ваше имя пользователя неверно», «Вы ввели неверный пароль» или «Изображение не может»).быть загруженным ") с таким известным методом try-catch.Хорошо ли полностью обрабатывать ошибки такого рода только с помощью try-catch?

Ответы [ 5 ]

3 голосов
/ 01 марта 2011

Основным преимуществом исключений является поведение "petite mort", локального die() внутри try{} блока, препятствующего дальнейшему выполнению кода.

Хотя это довольно удобно при обработке ошибок приложения, оно не очень хорошо подходит для проверки правильности ввода данных пользователем. Если пользователь сделал 3 ошибки при заполнении формы, было бы милостиво показать их сразу, а не одну за другой.

Вам скорее нужен шаблон POST / Redirect / GET для обработки пользовательских ошибок:

<?  
if ($_SERVER['REQUEST_METHOD']=='POST') {  

  $err = array();
  //performing all validations and raising corresponding errors
  if (empty($_POST['name']) $err[] = "Username field is required";  
  if (empty($_POST['text']) $err[] = "Comments field is required";  

  if (!$err) {  
    //if no errors - saving data and redirect
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
  }  else {
    // all field values should be escaped according to HTML standard
    foreach ($_POST as $key => $val) {
      $form[$key] = htmlspecialchars($val);
    }
} else {
  $form['name'] = $form['comments'] = '';  
}
include 'form.tpl.php';
?>  
1 голос
/ 01 марта 2011

Для ошибок конечного пользователя вы должны ввести отдельную систему обработки на уровне приложения.

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

1 голос
/ 01 марта 2011

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

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

0 голосов
/ 01 марта 2011

Ошибки и исключения являются техническим вопросом при проверке его бизнес-материи. Если IF работают с Business, TRY / CATCH обрабатывает технические вещи, которые они не смешивают, и вы не должны смешивать их. Есть моменты, когда вы должны использовать if, которая выдает исключение (PHP), но это необходимо на уровне инфраструктуры или структуры, например

if(database_error_handle_raises_error()) {
     throw new MyDatabaseException(driver_raised_error);
}

таким образом вы можете лучше контролировать ошибки. Но правило остается: Попробуй / поймай / брось = технический If / Else Switch = business

0 голосов
/ 01 марта 2011

Я использую собственный класс Log, который я написал, и устанавливаю его в качестве обработчика ошибок по умолчанию и обработчика исключений, а также предоставляю методы "debug", "info", "warning", "success" и "deprecated" для запись в журнал (и при необходимости отображение) сообщений.

Бонус в том, что он показывает дамп переменных в текущей области, когда происходит настоящая ошибка, а не просто сообщает вам, где она произошла.

...