Laravel如何处理PHP警告?

时间:2016-11-11 12:40:57

标签: php laravel exception ldap

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

关键是当我提供错误的用户和密码时,ldap_bind函数会向我们提供PHP警告。我对这个警告没问题,并且在文档中,当没有发生绑定时,函数返回 false

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

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

2 个答案:

答案 0 :(得分:3)

这是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

希望这清楚。 :)

答案 1 :(得分:0)

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

警告会记录在php的错误日志中,但无法将其他信息作为上下文传递。

如果该警告变为异常,那么您可以将异常传递给记录器以及其他信息,例如被命中的路由,请求变量等等,并将所有内容记录在一起。您还可以通过将其指定为日志,调试,信息,通知,警告,错误,严重,警报和紧急情况以及通过monolog来决定问题的严重性,并根据您的需要处理每个问题。这将创建一个更容易阅读的日志,使您的代码更容易调试。

此外,正如其他人所指出的那样,它还允许你在try catch块中完成你的工作,我相信它也会创建更整洁,更清晰的代码,而不是试图检查一些变量=== false