当从view composer引发自定义Laravel异常时,未调用方法render()

当从view composer引发自定义Laravel异常时,未调用方法render(),laravel,exception,eloquent,Laravel,Exception,Eloquent,编辑: 我对render方法有一个自定义异常,当我抛出它时(例如从控制器)调用该异常,但当我在View composer中抛出它时,不会调用该异常 所以当我这样做的时候 public function compose(View $view) { throw new CustomException(); } 并将dd()放入异常呈现方法 public function render() { dd('render is called'); } 我没有结果 如果我直接记录我的异常,

编辑: 我对render方法有一个自定义异常,当我抛出它时(例如从控制器)调用该异常,但当我在View composer中抛出它时,不会调用该异常

所以当我这样做的时候

public function compose(View $view)
{
    throw new CustomException();
}
并将dd()放入异常呈现方法

public function render()
{
    dd('render is called');
}
我没有结果

如果我直接记录我的异常,会发现首先抛出的是CustomException,然后作为结果,我会看到ErrorException

我找到了一个被扔的地方

\Illumb\View\Engines\CompilerEngine::handleViewException

protected function handleViewException(Exception $e, $obLevel)
{
    $e = new ErrorException($this->getMessage($e), 0, 1, $e->getFile(), $e->getLine(), $e);

    parent::handleViewException($e, $obLevel);
}
我在Laravel的文档中没有发现任何关于那个案子的提及。 我在github上发现了同样的问题:

所以问题是,这是预期的吗?有没有足够的方法来避免这种行为

编辑

因此,正如您所知,视图编译过程中的任何异常都会被截获,并作为
ErrorException
FatalThrowableError
重新抛出


您可以做的是截取
ErrorException
并检查
如果($e->getPrevious()instanceof\CustomException)
如果是,则执行您的代码,否则,让处理程序继续。

因此我找到了自己的工作解决方案。 我已经扩展了CompilerEngine并添加了额外的处理,以便在我不想抛出ErrorException时不抛出ErrorException。
重要的是-生成的异常必须从ErrorException继承。否则,您将面临对
\App\View\Engines\CompilerEngine::handleViewException
的多次调用,这可能会中断您的逻辑并将多个日志实体写入日志文件

谢谢你的建议,但还是不走运。似乎处理程序中的方法render()也没有被调用。这不会一直有效。我在评论中描述的行为表明ErrorException的父级将是ErrorException。我不知道它到底是如何发生的,但每次都会在ErrorException(当然第一次除外)下多次转到\Lightning\View\Engines\CompilerEngine::handleViewException,因此最终父对象将是ErrorException。事实上,我不确定它是否仍然容易理解。。。也许我需要结束这个问题。你唯一干净的解决办法是不在渲染管道中抛出异常,但在控制器中预先抛出异常(这是最佳实践),这在我的情况下是不可能的。此外,我还需要全局处理(如Handler提供的)。我已经发布了适合我的最终解决方案-@N69Sso你访问
$model->foo
会发生什么?@lagbox如果我直接记录我的异常,会发现首先抛出的是CustomException,然后我会看到ErrorException。我不太熟悉管道中的逻辑,但不知怎么的,它从会话中获取了以前的自定义异常,然后用ErrorException覆盖它。ErrorException正在由处理程序tho处理。请随时提出更具体的问题,以便我可以共享必要的信息。视图渲染中的异常被捕获,并且永远不会按原样到达处理程序。他们被拦截了。Laravel这样做是为了提供正确的错误报告(在blade中报告错误,而不是在/storage/framework/views/xx.php文件中报告编译后的php文件)@N69S我明白了。我试图稍微改变一下CompilerEngine的行为,以避免捕获需要应用处理的某些类型的异常。听起来不太好,但我认为在我的需求范围内没有其他方式。我想抛出其他异常(比如ViewCustomException)而不是ErrorException(请参阅我在问题中提到的CompilerEngine中的代码),它会导致多个抛出的ViewCustomException异常。如果您知道在Laravel视图渲染中应用的逻辑,您能告诉我为什么会发生这种情况吗?在我的回答中为您提供了解决方案@mom_u66;您修改了核心Laravel文件?@N69S否,我已经创建了自定义ViewServiceProvider并在那里注册了扩展编译器引擎。我没有完全删除ErrorException逻辑,只是为我的异常添加了额外的处理,以不破坏核心逻辑。