Правильно ли я настраиваю свой обработчик ошибок и менеджер исключений для Zend-Log?

У меня есть приложение ZF 3. Сообщения, которые я явно регистрирую, например, $log->debug() Появляются просто отлично. Исключений нет. Кажется, появляются ошибки, потому что это конфигурация php по умолчанию для перехода в stderr. Вот соответствующие строки из modules.config.php:

'service_manager' => [
    'factories' => [
        . . . . 
        'log' => \Zend\Log\LoggerServiceFactory::class,

    ],
],
'log' => [
    'writers' => [
        [
            'name' => 'stream',
            'options' => [ 'stream' => 'php://stderr' ]
        ],
    ],
    'errorHandler' => true,
    'exceptionhandler' => true,
],

Строки в источнике, которые наводят меня на мысль, что это правильный конфиг.

    if (isset($options['exceptionhandler']) && $options['exceptionhandler'] === true) {
        static::registerExceptionHandler($this);
    }

    if (isset($options['errorhandler']) && $options['errorhandler'] === true) {
        static::registerErrorHandler($this);
    }

Чтобы проверить это, я сделал следующие конечные точки:

public function errorAction()
{
    $msg = $this->params()->fromQuery('msg', 'Default Error message');
    trigger_error('Index Error Action' . $msg, E_USER_ERROR);
    $model = new JsonErrorModel(['msg' => $msg]);
    return $model;
}

public function exceptionAction()
{
    $msg = $this->params()->fromQuery('msg', 'Default Error message');
    throw new \RuntimeException('Index Exception Action' . $msg);
    $model = new JsonErrorModel(['msg' => $msg]);
    return $model;
}

1 ответ

Решение

У вас есть опечатка в вашем массиве конфигурации

'log' => [
    ....
    'errorHandler' => true,
    ....
],

Этот индекс не должен быть camelCase, он должен быть errorhandler (все буквы строчные). Я бы тоже добавил fatal_error_shutdownfunction => true для настройки, так что вы будете регистрировать фатальные ошибки.

Zend использует set_exception_handler для обработки исключений, так что имейте в виду, что регистрация исключений будет работать, только если они не находятся в блоке try / catch.

Устанавливает обработчик исключений по умолчанию, если исключение не перехвачено в блоке try / catch
Источник: http://php.net/manual/en/function.set-exception-handler.php

Все эти функции могут быть установлены вручную:

\Zend\Log\Logger::registerErrorHandler($logger);
\Zend\Log\Logger::registerFatalErrorShutdownFunction($logger);
\Zend\Log\Logger::registerExceptionHandler($logger);

Если вы хотите проверить это, вы можете сделать следующие вещи:

ошибка

public function errorAction()
{
    $log = $this->getServiceLocator()->get('log'); // init logger. You shouldn't use getServiceLocator() in controller. Recommended way is injecting through factory
    array_merge([], 111);
}

Это должно написать в журнале:

2017-03-09T15:33:47+01:00 WARN (4): array_merge(): Argument #2 is not an array {"errno":2,"file":"[...]\\module\\Application\\src\\Application\\Controller\\IndexController.php","line":80}  

Фатальная ошибка

public function fatalErrorAction()
{
    $log = $this->getServiceLocator()->get('log'); // init logger. You shouldn't use getServiceLocator() in controller. Recommended way is injecting through factory
    $class = new ClassWhichDoesNotExist();
}

Журнал:

2017-03-09T15:43:06+01:00 ERR (3): Class 'Application\Controller\ClassWhichDoesNotExist' not found {"file":"[...]\\module\\Application\\src\\Application\\Controller\\IndexController.php","line":85}

Или вы можете инициализировать регистратор в Module.php файл, если вам нужен регистратор во всем мире.

Я не думаю, что можно регистрировать исключения в действиях контроллера. Я не уверен, но действие отправляется в блоке try / catch.

Другие вопросы по тегам