我正在处理一个 PHP 项目,在该项目中我使用 Monolog 捕获异常并记录错误并返回一个用户友好的页面作为响应。
该项目目前处于初期阶段,所以我只是StreamHandler在公众无法访问的应用程序目录中使用 Monolog 的类将错误记录到文件中,随着我的进步,我意识到如果出现某种 IO 错误,这可能会失败等等我还将登录到数据库(可能是 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();
}
}
有只小跳蛙
UYOU
喵喔喔