【问题标题】:How Laravel handles PHP warnings?Laravel 如何处理 PHP 警告?
【发布时间】:2016-11-11 12:40:56
【问题描述】:

我正在尝试使用 Laravel 连接到 LDAP 服务器。重要的是,我使用的是 PHP 函数 ldap_connect 和 ldap_bind,而不是使用包来处理它。

关键是当我提供错误的用户名和密码时,ldap_bind 函数会给我们一个 PHP 警告。我可以接受这个警告,并且正如文档中所述,当绑定没有发生时,该函数返回 false。

但是,当这个警告被触发时,Laravel 会抛出一个异常。这不是异常,Laravel 不应该抛出异常,我不想将其作为异常处理;我只需要构建一个if 条件,它将向用户返回一条消息。

Laravel 是否将所有警告都视为异常?

【问题讨论】:

  • 如果抛出特定异常,您可以覆盖其处理程序以使其行为不同于默认值。请参阅 Laravel 文档中的 this。什么是异常类?
  • @IlkerMutlu 该类是 ErrorException。这也很奇怪,因为它是一个通用异常。
  • 那么你可以做的就是将ldap_bind调用包装在一个try catch块中。
  • @IlkerMutlu 我做到了!但关键是一个简单的 PHP 文件不会抛出异常。为什么 Laravel 会这样做?而且,正如我上面所说,抛出的异常是如此通用!

标签: php laravel exception ldap


【解决方案1】:

这是 Laravel 的预期行为。 Laravel 会将任何错误转换为 ErrorException 实例。这是Illuminate/Foundation/Bootstrap/HandleExceptions.php 类中的bootstrap() 方法。

public function bootstrap(Application $app)
{
    $this->app = $app;

    error_reporting(-1);

    set_error_handler([$this, 'handleError']);

    set_exception_handler([$this, 'handleException']);

    register_shutdown_function([$this, 'handleShutdown']);

    if (! $app->environment('testing')) {
        ini_set('display_errors', 'Off');
    }
}

error_reporting(-1); 将设置 PHP 报告所有错误(阅读更多 here)。

虽然这部分代码:

set_error_handler([$this, 'handleError']);

将设置自定义错误处理程序。如果检查 handleError() 方法,很明显 Laravel 会将任何错误转换为 ErrorException 实例。

public function handleError($level, $message, $file = '', $line = 0, $context = [])
{
    if (error_reporting() & $level) {
        throw new ErrorException($message, 0, $level, $file, $line);
    }
}

详细了解用户定义的错误处理程序here。

希望这能把事情弄清楚。 :)

【讨论】:

    【解决方案2】:

    不确定确切的原因,因为我没有编写它,但我认为以这种方式工作会使日志记录变得更加容易。

    警告会记录在 php 的错误日志中,但无法将附加信息与它一起作为上下文传递。

    如果该警告变成了异常,那么您可以将异常以及其他信息(例如命中的路由、请求变量等)传递给记录器……并将所有内容记录在一起。您还可以通过将问题指定为日志、调试、信息、通知、警告、错误、关键、警报和紧急情况来指示问题的严重性,并通过独白,按照您认为合适的方式处理每一个问题。这会创建一个更易于阅读的日志,并使您的代码更易于调试。

    此外,正如其他人所指出的,它还允许您在 try catch 块中完成工作,我相信这也比尝试检查某个变量 === false 是否创建更简洁的代码

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 2023-03-18
      • 2018-09-13
      • 2020-06-02
      • 2013-03-30
      • 2010-12-20
      • 2016-04-15
      • 2012-09-09
      相关资源
      最近更新 更多