Я работаю над Приложением, и возник вопрос. Я думал о том, чтобы позволить PHP ошибки стороне (они будут регистрироваться в базе данных или в файле) и управлять другими ошибками (например, «Ваше имя пользователя недействительно» или «Введен неверный пароль» или «Изображение не может быть загруженным ") с таким известным методом try-catch. Хорошо ли справляться с подобными ошибками только с помощью try-catch?
Основным преимуществом исключений является поведение «petite mort», локального die()
внутри try{}
block, предотвращающего выполнение дополнительного кода.
Хотя это очень удобно при обработке ошибок приложений, это становится не очень хорошо при работе с проверкой ввода пользователя. Если бы пользователь допустил три ошибки, заполняющих форму, было бы милосердно показать их сразу, а не один за другим.
Вам скорее нужен шаблон 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'; ?>
Я думаю: это не так, потому что это не ошибки или исключение, а просто недействительный ввод. Они также довольно распространены и в этом контексте не являются исключением по смыслу слова.
С другой стороны, поскольку каждое исключение нарушает текущее выполнение, это может привести к неожиданному поведению, когда какой-то код не выполняется, просто потому, что кто-то ввел неизвестное имя пользователя или что-то еще. В случае ошибок или исключений вы обычно хотите остановить выполнение, потому что предположите, что выполнение не является (разумным) возможным (пока вы не поймаете исключение и не продолжаете).
Для ошибок конечного пользователя вы должны ввести отдельную систему обработки уровня приложения.
Исключения полезны для обработки ошибок (ошибок, возникающих при производстве), в то время как пользовательские ошибки E_USER_ лучше всего подходят для сигнализации о проблемах с данными / отладки / безопасности (все, что должно быть обработано на стадии разработки).
Я использую собственный класс журнала, который я написал, и настроил его как обработчик ошибок по умолчанию и обработчик исключений, а также предоставил методы «отладки», «информация», «предупреждение», «успех» и «устаревшие» для ручного ведения журнала ( и, возможно, отображение) сообщений.
Бонус – это показывает дамп переменных в текущей области, когда возникает реальная ошибка, а не просто сообщая вам, где она произошла.
Ошибки и исключения – это технический вопрос, а валидация – это бизнес-матер. IFs обрабатывают бизнес, TRY / CATCH обрабатывает технический материал, который они не смешивают, и вы не должны смешивать их. Бывают случаи, когда вы должны использовать if, который генерирует исключение (материал PHP), но это необходимо на уровне структуры / архитектуры, например
if(database_error_handle_raises_error()) { throw new MyDatabaseException(driver_raised_error); }
таким образом вы можете лучше контролировать ошибки. Но правило остается: Try / Catch / Throw = technical If / Else Switch = business