jasny/error-handler

此包已被弃用,不再维护。未建议替代包。

支持 PSR-7 的错误处理器

v0.2.0 2017-01-25 01:27 UTC

This package is auto-updated.

Last update: 2019-12-02 14:17:59 UTC


README

Build Status Scrutinizer Code Quality Code Coverage SensioLabsInsight Packagist Stable Version Packagist License

支持 PSR-7 的错误处理器。

安装

Jasny 错误处理器包可在 packagist 上找到。使用 composer 安装。

composer require jasny/error-handler

用法

$errorHandler = new Jasny\ErrorHandler();

仅创建错误处理器不会做任何事情。您可以使用它进行日志记录、处理致命错误以及作为 PSR-7 兼容的中件间。

日志记录

默认情况下,错误处理器仅捕获 抛出异常 并不设置 PHP 错误处理器

要记录错误,请使用 setLogger() 设置记录器。您可以使用任何 PSR-3 兼容的记录器,如 Monolog

logUncaught() 方法将设置错误处理器,以便可以记录警告和通知。它还可能 注册一个关闭函数 来处理不可捕获的致命错误。

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$errorHandler = new Jasny\ErrorHandler();

$log = new Logger('test');
$log->pushHandler(new StreamHandler('path/to/your.log'));

// Log fatal errors, warnings and uncaught exceptions
$errorHandler->setLogger($log);

$errorHandler->logUncaught(E_PARSE | E_ERROR | E_WARNING | E_USER_WARNING);
$errorHandler->logUncaught(Exception::class);
$errorHandler->logUncaught(Error::class); // PHP7 only

PSR-7 兼容的中件间

错误处理器可以用作 PSR-7 兼容(双遍)中件间。

错误将捕获 异常错误

您可以使用此中件间与以下软件一起使用:

例如,与 Relay 一起使用

use Relay\RelayBuilder;
use Jasny\HttpMessage\ServerRequest;
use Jasny\HttpMessage\Response;

$errorHandler = new Jasny\ErrorHandler();

$relay = new RelayBuilder();
$dispatcher = $relay->newInstance([$errorHandler->asMiddleware()]);

$response = $dispatcher((new ServerRequest())->withGlobalEnvironment(), new Response());

或与 Jasny Router 一起使用

use Jasny\Router;
use Jasny\Router\Routes\Glob as Routes;
use Jasny\HttpMessage\ServerRequest;
use Jasny\HttpMessage\Response;

$router = new Router(new Routes(['/**' => ['controller' => '$1', 'id' => '$2']));

$errorHandler = new Jasny\ErrorHandler();
$router->add($errorHandler->asMiddleware());

$response = $dispatcher((new ServerRequest())->withGlobalEnvironment(), new Response());

PHP 5 支持

在 PHP 5 中,错误不会抛出,因此中件间不会处理它。要为 PHP5 中的错误添加中件间支持,您应该调用 converErrorsToExceptions()。此方法将错误转换为 ErrorException

处理致命错误

未抛出的错误,如语法错误,不会被捕获,并会导致致命错误。使用 logUncaught() 方法,您可以指定错误处理器还应捕获这类错误。

使用 onFatalError() 方法,您可以采取额外操作,如输出漂亮的错误信息。

ob_start();

$errorHandler = new Jasny\ErrorHandler();

$errorHandler->logUncaught(E_ERROR | E_RECOVERABLE_ERROR | E_USER_ERROR);

$errorHandler->onFatalError(function() {
    http_response_code(500);
    header('Content-Type: text/html');
    echo "<h1>An unexpected error occured</h1><p>The error has been logged.</p>";
}, true);

true 作为 onFatalError 的第二个参数,在调用您的函数之前输出缓冲区。

与其他错误处理器结合使用

使用错误记录器可能会丢失其他错误处理器可以获取的回溯信息。Jasny 错误处理器将始终调用先前的错误处理器,包括 PHP 内置的错误处理器。

当使用 Rollbar 时,您不应使用 Rollbar 的 Monolog 处理器。通过使用 Rollbar 自身的错误处理器,您将获得更好的错误报告。

use Jasny\ErrorHandler;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

// Rollbar error handler will log uncaught errors
Rollbar::init(array('access_token' => 'POST_SERVER_ITEM_ACCESS_TOKEN'));

$log = new Logger('test');
$log->pushHandler(new RollbarHandler(Rollbar::$instance));

$errorHandler = new ErrorHandler();

// Jasny error handler will only log caught errors
$errorHandler->setLogger($log);