У меня есть контроллер laravel, который может генерировать исключение и глобальное промежуточное программное обеспечение, которое ловит это исключение. В полу-псевдокоде:Исключение из контроллера в промежуточном программном обеспечении
// App\Controllers\...
class Controller {
function store() {
throw new FormException; // via validation etc, but it's thrown here
}
}
// App\Http\Middleware\...
class Middleware {
function handle(Closure $next) {
try {
// Breakpoint 1
return $next(); // $response
// Breakpoint 2
}
catch (FormException $ex) {
// Breakpoint 3
exit('FormException caught!');
}
}
}
Проблема в том, что исключение никогда не попадается. Где-то в конвейере приложение выхватывает исключение и печатает красивую страницу с ошибками, но это должно быть уловлено моим промежуточным программным обеспечением, чтобы оно могло корректно обрабатывать его.
- Breakpoint 1 должен вызвать, и это делает < < хорошо
- Breakpoint 2 не должно вызывать, и она не < < хорошо
- Breakpoint 3 должен вызвать, но это не < < какие??
Единственный способ, которым я могу представить себе, что мое промежуточное ПО не улавливает его, - это если он поймал где-то глубже внутри конвейера, а не дальше/вокруг, но я не могу найти попытку/улов в другом промежуточном программном обеспечении или в код выполнения трубопровода.
Куда это исключение попало? Зачем?
Это может быть не очень хороший образец, но сейчас меня это не волнует. Мне больше любопытно, чем что-либо еще. Я полностью неправильно понимаю промежуточное ПО Laravel?
Мой собственный супер простой тест промежуточного слоя делает то, что я ожидал: https://3v4l.org/Udr84 - catch и handle исключение внутри промежуточного программного обеспечения.
Примечание:
$response
объекта (возвращаемое значение$next()
) является перевалено страницей исключения, так что уже обработаны. Где и почему?- Работа с исключением в
App\Exceptions\Handler::render()
работает, но я хочу, чтобы вся логика была в пакете промежуточного программного обеспечения, а не в коде приложения.
Соответствующий Laravel код:
Kernel::handle()
запускает промежуточный трубопровод < < это имеет всеохватывающий улов(), но мой улов() приходит первое, верно?Pipeline::then()
начнется выполнение MiddleWarePipeline::getSlice()
ручки и создает$next
затворы
Я согласен: обработка исключений в промежуточном программном обеспечении была бы полезна в пакетах: я разрабатываю промежуточное программное обеспечение для обработки транзакций базы данных, и мне нужно совершить/откат от промежуточного программного обеспечения. Быть в состоянии поймать исключения было бы очень полезно. Теперь я должен пойти «напуганным» способом;) – Moppo
Большое спасибо Rudie. '** Funky way **' спас мой день :) Хорошо работает на Laravel ** v5.5.33 ** –