我有一个可以抛出异常的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!');
}
}
}
问题是该例外从未被捕获。在管道中的Somwhere,应用程序捕获异常并打印一个漂亮的错误页面,但它应该被我的中间件抓住,以便它可以正确处理它。
- 断点1应该触发,它也< <好
- 断点2应该不会触发,并且它不< <好
- 断点3应触发,但是它没有< <什么??
我能想象我的中间件不抓它,唯一的办法是,如果它抓住了管道内的某处深,没有进一步向上/左右,但我找不到其他中间件任何try/catch语句,或在管道执行代码。
这个异常是在哪里发现的?为什么?
这可能不是一个很好的模式,但我现在不在意这一点。我比其他任何事都好奇。我完全误解Laravel的中间件吗?
我自己的超级简单中间件测试做我期望的:https://3v4l.org/Udr84 - 抓住并处理中间件内的异常。
注:
- 的
$response
对象(的$next()
返回值)是处理后的异常页,所以它已经被处理。地点和原因? - 处理
App\Exceptions\Handler::render()
作品中的异常,但我希望所有逻辑都处于中间件包中,而不是应用程序代码中。
相关Laravel代码:
Kernel::handle()
启动中间件管道< <这一个包罗万象的捕捞(),但我赶上()是第一位的,对不对?Pipeline::then()
启动中间件执行Pipeline::getSlice()
手柄和创建$next
关闭
我同意:中间件中的异常处理在包中是有用的:我正在开发一个中间件来处理数据库事务,我需要从中间件提交/回滚。能够捕捉异常会非常有用。现在我必须走'时髦'的方式;) – Moppo
非常感谢Rudie。 '** Funky way **'拯救了我的一天:)在Laravel ** v5.5.33 **上正确运行** –