Ошибки и исключения не полностью совпадают. Исключениями являются ошибки, которые являются «исключительными» обстоятельствами, такими как невозможность подключения к базе данных, невозможность связи с внешним ресурсом или, возможно, запись пользователя, которую вы считаете исключением, что приводит к остановке приложения.
Учитывая, что, используя исключения, вы можете реализовать всплывающее сообщение об ошибке в ваших моделях / бизнес-объектах и просто перехватить ошибку как можно выше в стеке вызовов (в идеале на контроллере или главной странице, если вы не используете шаблон 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 существует дополнительная нагрузка на производительность, не говоря уже о дополнительной задержке после того, как вы распределитесь (если вы ожидаете, что ваше приложение будет большим). Я бы не советовал использовать его для сообщений об ошибках. Обычно я просто использую его для сохранения данных. Сообщения об ошибках не предназначены для сохранения, и сеть по своей природе не имеет состояния.