Я думаю, что вводить регистратор в CustomException неправильно, потому что (как вы указали) он нарушает SRP и увеличивает сложность ваших классов исключений.
Я предлагаю вам отделить Exception от ExceptionHandler. Класс исключения должен содержать только информацию о том, «что (и где) пошло не так». ExceptionHandler отвечает за регистрацию исключения (и при необходимости выполняет другую работу с исключением).
Таким образом, вы можете настроить один глобальный ExceptionHandler
(используя set_exception_handler и < href = "http://php.net/manual/en/function.set-error-handler.php" rel = "nofollow noreferrer"> set_error_handler или какой-либо механизм обработки исключений на основе инфраструктуры, например Symfony ExceptionListener), который перехватит все необработанные исключения.
<?php
class ExceptionHandler {
/**
* @var Logger
*/
private $logger;
public function __construct(Logger $logger)
{
$this->logger = $logger;
}
public function handle(Throwable $e)
{
$this->logger->logException($e);
}
}
В коде приложения вы по-прежнему можете генерировать и перехватывать исключения. Думаю, есть 4 типичных ситуации.
Полностью восстанавливаемые исключения
Это общий способ обработки восстанавливаемых исключений - таких ситуаций, когда вы вообще не хотите терпеть неудачу, но вам нужно что-то делать, когда такое исключение возникает.
<?php
try {
$methodThatThrowsException();
}
catch (DoesNotMatterException $e) {
// do some stuff and continue the execution
// note, that this exception won't be logged
}
Исправляемое зарегистрированное исключение
То же, что и предыдущее, но вы хотите зарегистрировать это исключение.
<?php
try {
$methodThatThrowsException();
}
catch (NonCriticalExceptionThatShouldBeLogged $e) {
$this->exceptionHandler->handle($e); // log exception
// do some stuff and continue the execution
}
Невосстановимые исключения с "финализатором"
Вы хотите выполнить определенную бизнес-логику, а затем потерпите неудачу. Вы можете перехватить исключение, обработать его и затем снова выбросить. Глобальный обработчик исключений обработает это исключение и зарегистрирует его.
<?php
try {
$methodThatThrowsException();
}
catch (CriticalException $e) {
// do some stuff like cleanup/transaction rollback
throw $e;
}
Невосстановимые исключения
Если вы хотите просто зарегистрировать исключение и потерпеть неудачу, вы можете просто выбросить это исключение, и глобальный обработчик исключений поймает и зарегистрирует его.
<?php
$methodThatThrowsException();
// ExceptionHandler::handle will be executed
person
Ivan Kalita
schedule
01.03.2018