如何绕过Laravel异常处理

7

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

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

Laravel不会进入此代码并立即启动其自己的错误处理。有没有想法绕过Laravel自己的实现并使用我自己的Catch。
编辑:我刚发现Laravel使用与Symfony相同的异常处理程序,因此我还添加了Symfony2标签。
编辑2:
我通过禁用Guzzle异常并手动检查返回头来解决了这个问题。虽然这是一种捷径,但在这种情况下,它可以完成任务。感谢您的回复!

你能否发布更多相关的代码(包括try块)? - The Alpha
3个回答

9
实际上,在Laravel中可以捕获这个异常,你只需要遵守(并理解)命名空间规则即可:
如果你有:
namespace App;

并且你做到了。
catch (Guzzle\Http\Exception\BadResponseException $e) 

PHP理解你正在尝试

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

因此,为了使其工作,您只需要一个根斜杠:
catch (\Guzzle\Http\Exception\BadResponseException $e) 

它会起作用。


1
哇!!所以你应该注意命名空间,catch(Exception e)是行不通的,正确写法应该是catch(\Exception e)。 - Manish

2

不要使用你的代码

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

2

默认情况下,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文档


2
请注意:Laravel将继续将处理错误的责任传递给其注册的处理程序,直到其中一个返回Response对象。Laravel在处理错误时使用责任链模式。这使您可以以任何方式处理错误。您可以像记录Guzzle错误一样,然后让Laravel的其他错误处理程序决定如何响应。有关更多解释,请参见此博客文章 - fideloper
2
这不是回答“如何绕过它?”并在我调用可能引发一些异常的内容后立即处理我的方法的问题。为什么我要编写代码来处理我的类知道如何处理的事情?看看Sentry的Cartalyst示例:http://docs.cartalyst.com/sentry-2/authentication/login。这些东西在Laravel上永远不会起作用。 - Antonio Carlos Ribeiro
@AntonioCarlosRibeiro,我在想如何注册自己的错误处理,我错了吗? - The Alpha
@AntonioCarlosRibeiro,你是否成功绕过Laravel异常处理?我也支持你在方法本身中处理异常并从那里返回响应的概念,而不是将所有异常处理放在一个公共位置。 - Manish
是的,我做到了,并在这里添加了一个答案来展示如何实现。 - Antonio Carlos Ribeiro
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接