Я работаю над проектом PHP, где я ловлю исключения и регистрирую ошибки, используя Monolog и возвращая удобную для пользователя страницу в качестве ответа.
Проект в настоящее время находится в стадии разработки, поэтому я нахожусьпросто регистрируя ошибки в файле с помощью класса StreamHandler
Monolog в каталоге приложения вне досягаемости публики, так как я прогрессирую, я понимаю, что это может произойти сбой, если есть какая-то ошибка ввода-вывода, и поэтому я также буду регистрироваться в базе данных (возможен ElasticSearch) и отправка критических ошибок по электронной почте администратору.
Поскольку я использую StreamHandler
, я вижу, что он выдает исключение, если не удается открыть файл.
Теперь, как мне следует обрабатывать этот случай исключения и как его регистрировать, если сам механизм регистрации выходит из строя?
Я могу обработать исключение другим регистратором, который отправляет электронное письмов таких критических ситуациях, но опять же, как мне обработать исключение, выдаваемое почтовой программой?
Я предполагаю, что страница будетзаполнено слишком большим количеством блоков try-catch с регистраторами, разбросанными по всей странице, что выглядело бы ужасно.
Существует ли элегантное, чистое решение, которое не включает слишком много вложенных блоков try-catch, которые используютсяв крупных проектах?(Непопулярные мнения также приветствуются)
Вот код для справки:
try
{
$routes = require_once(__DIR__.'/Routes.php');
$router = new RouteFactory($routes, $request, \Skletter\View\ErrorPages::class);
$router->buildPaths('Skletter\Controller\\', 'Skletter\View\\');
$app = new Application($injector);
$app->run($request, $router);
}
catch (InjectionException | InvalidErrorPage | NoHandlerSpecifiedException $e)
{
$log = new Logger('Resolution');
try
{
$log->pushHandler(new StreamHandler(__DIR__ . '/../app/logs/error.log', Logger::CRITICAL));
$log->addCritical($e->getMessage(),
array(
'Stack Trace' => $e->getTraceAsString()
));
}
catch (Exception $e)
{
echo "No access to log file: ". $e->getMessage();
// Should I handle this exception by pushing to db or emailing?
// Can possibly introduce another nested try-catch block
}
finally
{
/**
* @var \Skletter\View\ErrorPageView $errorPage
*/
$errorPage = $injector->make(\Skletter\View\ErrorPages::class);
$errorPage->internalError($request)->send();
}
}