Я использую одно Закрытие для обработки исключений в моем приложении:
App::error(function(Exception $exception, $code)
{
if (is_a($exception, 'MsgException')) {
...
return;
}
dd($exception); // debugging
});
Странно то, что если я брошу MsgException
…
<?php use MsgException; // alias for ExampleNamespace\MsgException
...
throw new MsgException();
…который является пользовательским классом …
<?php namespace ExampleNamespace;
use RuntimeException;
class MsgException extends RuntimeException {}
… is_a($exception)
является false
а также dd($exception)
говорит, что это ErrorException
,
Я понятия не имею, почему это происходит. Любые предложения или идеи, как я могу отладить свое приложение?
Не используйте общий обработчик исключений для обработки других типов исключений. Зарегистрируй свой.
App::error(function(ExampleNamespace\MsgException $exception, $code)
{
dd($exception); // debugging
});
Подробнее о App::error
доступны Вот.
Ну, короткий ответ довольно прост: он не работает, потому что исключение выбрасывается внутри представления.
Вы можете проверить это, просто добавив
throw new \RuntimeException('Test');
к методу контроллера или замыканию маршрутизации или в любом месте за пределами представления и путем добавления
<?php throw new \RuntimeException('Test'); ?>
в шаблон просмотра. Laravel покажет первый как RuntimeException
а второй как ErrorException
,
К сожалению, это не помогает на самом деле решить проблему.
PS: в Illuminate \ View \ Engines \ CompilerEngine метод handleViewException заменяет исходное исключение:
protected function handleViewException($e, $obLevel)
{
$e = new \ErrorException($this->getMessage($e), 0, 1, $e->getFile(), $e->getLine(), $e);
parent::handleViewException($e, $obLevel);
}