如何绕过 Laravel 异常处理


How to bypass Laravel Exception handling

我有一个检查用户是否具有有效会话信息的方法。这应该抛出一个异常,Guzzle'Http'Exception'BadResponseException但是当我尝试捕获它时:

catch (Guzzle'Http'Exception'BadResponseException $e) 
{
    return false;
} 
return true

Laravel没有到达此代码,并立即开始自己的错误处理。以及关于如何绕过 Laravels自己的实现并使用我自己的 Catch 的想法。

编辑:我刚刚发现Laravel使用与Symfony相同的异常处理程序,所以我还添加了Symfony2标签。

编辑2:

我通过禁用 Guzzle 异常并手动检查返回标头来解决此问题。这有点捷径,但在这种情况下,它可以完成工作。感谢您的回复!

实际上这个异常可以在 Laravel 中捕获,你只需要尊重(并理解)命名空间:

如果你有

namespace App;

而你做到了

catch (Guzzle'Http'Exception'BadResponseException $e) 

PHP 明白你正在尝试

catch ('App'Guzzle'Http'Exception'BadResponseException $e) 

因此,要使其正常工作,您只需要一个根斜杠:

catch ('Guzzle'Http'Exception'BadResponseException $e) 

它会起作用。

默认情况下,app/start/global.php文件包含所有异常的错误处理程序。但是,如果需要,您可以指定更多处理程序。处理程序根据它们处理的异常type-hint进行调用。例如,您可以创建一个仅处理BadResponseException实例的处理程序,例如

App::error(function(Guzzle'Http'Exception'BadResponseException $exception)
{
    // Handle the exception...
    return Response::make('Error! ' . $exception->getCode());
});

另外,请确保您有一个定义良好的(BadResponseException)类。 阅读更多关于Laravel文档的信息。

而不是你的代码

catch (Guzzle'Http'Exception'BadResponseException $e) 
{
   return false;
} 
return true

使用此解决方案

catch ('Exception $e) 
{
   return false;
} 
return true

以捕获 Guzzle 抛出的所有可能的异常。

如果您明确想要捕获 BadResponseException,您还可以在异常的类命名空间前面加上"''"。

catch ('Guzzle'Http'Exception'BadResponseException $e) 
{
   return false;
} 
return true