禁用抛出E_USER_WARNING的异常

时间:2017-06-21 04:20:14

标签: php laravel exception-handling laravel-5.2

当我这么做时,Laravel将返回500:

trigger_error("Some message", E_USER_WARNING);

我需要它 not 错误输出,但我希望它运行\App\Exceptions\Handler::report,将警告记录到Sentry。

如何使用Laravel 5.2禁用将警告和错误转换为异常?

3 个答案:

答案 0 :(得分:4)

您可以编辑laravel的错误处理程序,仅报告HandleExceptions.php

中的警告
public function handleError($level, $message, $file = '', $line = 0, $context = [])
{
    $exception = new ErrorException($message, 0, $level, $file, $line);

    if (E_USER_WARNING & $level) {
        $this->getExceptionHandler()->report($exception);
    }
    elseif (error_reporting() & $level) {
        throw $exception;
    }
}

用户警告:修改供应商代码通常是一个坏主意。

您可以通过扩展HandleExceptions课程并在Kernel.php

中注册新课程来避免修改供应商代码
MyHandleExceptions extends HandleExceptions {
    public function handleError($level, $message, $file = '', $line = 0, $context = [])
    {   
        if (E_USER_WARNING & $level) {
            $this->getExceptionHandler()->report(new ErrorException($message, 0, $level, $file, $line));
        }
        else {
            return parent::handleError($level, $message, $file, $line, $context);
        }
    }
}

答案 1 :(得分:1)

由于您在ErrorHandler中时无法显示页面的正常内容,因此您必须抛出另一条错误消息:

Route::get('error', function() {
    $client = new Raven_Client(env("SENTRY_DSN"));
    $client->captureMessage("Some Warning", ['log'], [
        'level' => 'warning'
    ]);
});

这将为哨兵创建一个自定义警告条目,而不会在php中抛出一个会阻止您正常代码的真实错误。

你也可以将它包装在一个函数

function trigger_sentry_warning($message) {
    $client = new Raven_Client(env("SENTRY_DSN"));
    $client->captureMessage($message, ['log'], [
        'level' => 'warning'
   ]);
}

答案 2 :(得分:0)

我认为它应该由php处理。你试过error_reporting()吗? set_error_handler

更多信息:

  

开箱即用,Laravel支持将日志信息写入单个文件,日常文件,syslog和错误日志。要配置Laravel使用的存储机制,您应该修改config / app.php配置文件中的日志选项。例如,如果您希望使用每日日志文件而不是单个文件,则应将应用配置文件中的日志值设置为每日

laravel error and logging