【问题标题】:How to bypass Laravel Exception handling如何绕过 Laravel 异常处理
【发布时间】:2013-10-22 00:25:04
【问题描述】:

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

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

Laravel 没有处理这段代码并立即开始它自己的错误处理。以及如何绕过 Laravel 自己的实现并使用我自己的 Catch 的想法。

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

编辑2:

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

【问题讨论】:

  • 能否贴出更多相关代码(包括try块)

标签: php exception symfony laravel guzzle


【解决方案1】:

代替你的代码

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】:

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

    如果你有

    namespace App;
    

    你会的

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

    PHP 理解您正在尝试

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

    所以,要让它工作,你只需要一个根斜线:

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

    它会起作用的。

    【讨论】:

    • 哇!!所以你应该注意命名空间 catch(Exception e) 不起作用它应该是 catch(\Exception e)
    【解决方案3】:

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

    【讨论】:

    • 注意: Laravel 将继续将处理错误的责任交给其注册的处理程序,直到返回一个 Response 对象。 Laravel 在处理错误时使用 Chain of Responsibility 模式。这使您可以以任何方式处理错误。你可以做一些事情,比如记录 Guzzle 错误,然后让 Laravel 的其他错误处理程序决定如何响应。更多解释请参见this blog post
    • 这不是“如何绕过它?”的答案。并在我调用可能引发一些异常的东西之后立即在我的方法中处理异常。为什么我应该在我的班级之外编写代码来处理我的班级知道如何处理的事情?看看一些 Sentry 的 Cartalyst 示例:docs.cartalyst.com/sentry-2/authentication/login。这些东西永远不会在 Laravel 上运行。
    • @AntonioCarlosRibeiro,我想过如何注册自己的错误处理的问题,我错了吗?
    • 正如他/她所说的“但当我试图抓住它时:”。 Imo,正如代码所示,他试图在一个无法成功的方法中捕获异常,因为 Laravel 在其他任何事情之前捕获它。
    • @AntonioCarlosRibeiro,哦!我现在看到了,OP 在类本身中使用了try catch
    猜你喜欢
    • 2012-06-30
    • 1970-01-01
    • 2014-04-22
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多