【问题标题】:Laravel abort() not working inside try and catchLaravel abort() 在 try and catch 中不起作用
【发布时间】:2019-06-27 11:14:23
【问题描述】:
abort(403); <-- works fine, will display laravel abort page

try{
    $rows = DB::.......

    if ( !$Rows ) {
        abort(403);<-- this will become exception
    } else {

    }
} catch (Exception $e) {

}

当用户请求时我有一个页面,如果没有行我想使用 laravel abort();终止页面。

但是我使用 try catch 包装我的代码,它会变成捕获错误并导致 laravel abort() 不起作用。

谁来解决这个问题?

【问题讨论】:

  • 不要捕获顶级异常,而是需要捕获的特定异常
  • 我创建了一个自定义函数来在我发现任何错误后保存日志,这就是我将所有代码都包含在其中的原因。
  • 找出abort抛出的异常,检查stackoverflow.com/questions/38316800/…类并在catch中再次中止......或者抛出一个自制的异常然后在catch中中止
  • 您想从查询中捕获什么,即为什么它首先需要位于 try/catch 中?

标签: laravel


【解决方案1】:

试试这个代码

      try{
        abort(403);
    } catch (\Exception $e) {

        if($e->getStatusCode()==403)
            abort(403);
    }

【讨论】:

  • 检查一下,让我知道它是否有用
  • 谢谢。我怎么能记得从哪里导入这些类。当我按 cntrl+space 时我的 PHP 风暴显示 1000 个异常引用类;)
  • 不需要为这种类型的异常添加使用 @sabertababaeyazdi
【解决方案2】:

\Exception 是所有 php 异常的基类。因此,当您在 try..catch 块中捕获 \Exception 时,您实际上是在捕获所有异常。

当你执行 abort(403) 时,laravel 内部会抛出 HttpException,statusCode 为 403。

如果你在 laravel 中看到,HttpException 扩展了 php 的 \RuntimeException,它最终确实扩展了 \Exception 类。

解决方案是捕获特定异常而不是捕获\Exception。比如担心mysql连接问题,可以抓PDOException。最好具体说明您正在捕获的异常。

<?php 

try{
    $rows = DB::someaction()...;

    if (!$rows) {
        abort(403);
    }
    // Do stuff with $rows

}catch (PDOException $e) {
    // take action for specific exception
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    相关资源
    最近更新 更多