Laravel如何处理PHP警告?

3
我正在尝试使用Laravel连接到LDAP服务器。重要的是要说明,我正在使用PHP函数ldap_connectldap_bind而不是使用软件包来处理它。
问题在于,当我提供错误的用户名和密码时,ldap_bind函数会给我们一个PHP警告。我对这个警告很满意,并且如文档所述,当绑定未发生时,该函数返回false
但是,当触发此警告时,Laravel会抛出一个异常。这不是异常,Laravel不应该抛出异常,我也不想将其作为异常处理;我只需要构建一个if条件,将向用户返回一条消息。
Laravel是否将所有警告都捕获为异常?

如果抛出了特定的异常,您可以重写其处理程序以与默认行为不同。请参阅Laravel文档中的此链接。异常类是什么? - Ilker Mutlu
@IlkerMutlu 这个类是ErrorException。这也很奇怪,因为它是一个通用的异常。 - Victor Leal
然后你可以将ldap_bind调用放在一个try catch块中。 - Ilker Mutlu
@IlkerMutlu 我做到了!但问题是一个简单的PHP文件不会抛出异常。为什么Laravel会抛出异常呢?而且,正如我之前所说,抛出的异常太泛泛无边了! - Victor Leal
2个回答

5

这是 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设置为报告所有错误(在此处阅读更多信息:此处)。
虽然这段代码:
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);
    }
}

关于用户自定义错误处理程序的更多信息,请点击这里

希望这样可以让事情更加清晰明了。 :)


0

不确定具体原因,因为我没有写过它,但我认为这样做可以更容易地记录日志。

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

然而,如果将该警告转换为异常,您就可以将异常以及其他信息(如所访问的路由、请求变量等)一起传递给日志记录器,并将所有内容记录在一起。您还可以通过指定日志、调试、信息、通知、警告、错误、严重、警报和紧急等级来决定问题的严重程度,并通过monolog根据需要处理每个级别。这样创建的日志更易于阅读,使您的代码更易于调试。

此外,正如其他人指出的那样,它还允许您在try catch块中进行工作,我认为这比尝试检查某些变量=== false更加整洁和清晰。


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