weew/error-handler

PHP的错误处理器。

v3.5.2 2016-07-21 11:17 UTC

README

Build Status Code Quality Test Coverage Version Licence

目录

安装

composer require weew/error-handler

简介

这个小型库允许你轻松地在代码中全局处理异常、可恢复和致命错误。某些类型的错误是可恢复的,而某些不是,这种错误处理应该用作最后的手段来执行一些日志记录等。

启用错误处理

你可以手动在错误处理器可以处理的错误类型之间切换:异常、可恢复和致命错误。

$errorHandler = new ErrorHandler();

// enable exception handling
$errorHandler->enableExceptionHandling();

// enable handling of recoverable php errors
$errorHandler->enableRecoverableErrorHandling();

// enable handling of fatal php errors
$errorHandler->enableFatalErrorHandling();

// enable handling of recoverable and fatal php errors
$errorHandler->enableErrorHandling();

// enable handling of exceptions, recoverable and fatal php errors
$errorHandler->enable();

你可以始终检查是否已启用某种类型的错误处理。

$errorHandler->isExceptionHandlingEnabled();
$errorHandler->isRecoverableErrorHandlingEnabled();
$errorHandler->isFatalErrorHandlingEnabled();

关于错误处理器

错误处理器是一些小逻辑,你可以在ErrorHandler上注册。有两种不同类型的处理器:错误和异常处理器。它们都遵循相同的模式:一个处理器接受发生错误/异常的抽象并返回一个boolean值,以确定错误是否已被处理。如果错误已被处理,错误处理器必须返回true,返回false是可选的。

错误处理

在PHP中,有两种不同类型的错误,你可以从中恢复的错误和你无法从中恢复的错误。如果你想区分它们,所有PHP错误都转换为IError的一个实例。它将包含有关发生错误的所有相关信息,并将其传递到你的错误处理器中。

PHP错误的抽象

所有PHP错误都转换为IError的一个实例。它充当所有相关错误信息的容器,并通过几个getter方法使其可访问。

// is this kind of error recoverable or not
$error->isRecoverable();

// get error type (E_WARNING, E_STRICT, etc.)
$error->getCode();

// get error message
$error->getMessage();

// get error file
$error->getFile();

// get error line
$error->getLine();

还有一个非常有用的ErrorType类,它包含有关所有类型PHP错误的信息,并可用于根据错误类型编号获取错误类型名称,检查特定类型的错误是否可恢复,等等。

处理可恢复的PHP错误

为可恢复错误创建一个错误处理器。

$errorHandler = new ErrorHandler();
$errorHandler->addRecoverableErrorHandler(function(IError $error) {
    return true;
});

处理致命的PHP错误

为致命错误创建一个错误处理器。

$errorHandler = new ErrorHandler();
$errorHandler->addFatalErrorHandler(function(IError $error) {
    return true;
});

处理两种错误

创建一个同时涵盖可恢复和致命错误的错误处理器。

$errorHandler = new ErrorHandler();
$errorHandler->addErrorHandler(function(IError $error) {
    if ($error->isRecoverable()) {
        return true;
    }
});

复杂的错误处理器

如果你不想使用回调,你可以创建一个复杂的错误处理器类。你所要做的就是实现INativeErrorHandler接口。

class CustomErrorHandler implements INativeErrorHandler {
    public function handle(IError $error) {
        return true;
    }
}

$errorHandler = new ErrorHandler();
$errorHandler->addErrorHandler(new CustomErrorHandler());

异常处理

错误处理器允许你定义你在异常处理器中想要处理的异常类型。有两种方法可以将异常处理器插入:使用回调或使用IExceptionHandler接口的实现。

异常处理器回调

当使用简单的可调用/回调作为异常处理器时,你所要做的就是定义函数签名中的异常类型。错误处理器将确定你的异常处理器支持的异常类型,并只给它可以处理的那些。与错误一样,异常处理器必须返回true,以表明异常已被处理。

下面是一个只处理HttpException或其子类的异常处理器的示例。

$errorHandler = new ErrorHandler();
$errorHandler->addExceptionHandler(function(HttpException $ex) {
    return true;
});

复杂的异常处理器

您可以通过传入一个 IExceptionHandler 实例来添加异常处理器。当抛出异常时,错误处理器会询问您的自定义异常处理器是否支持此类异常,如果支持,则会请求处理器处理此异常。

class CustomExceptionHandler implements IExceptionHandler {
    public function supports(Exception $ex) {
        return $ex instanceof HttpException;
    }

    public function handle(HttpException $ex) {
        return true;
    }
}

$errorHandler = new ErrorHandler();
$errorHandler->addExceptionHandler(new CustomExceptionHandler());

将错误转换为异常

当PHP错误发生时,它将被转换为 IError 实例并传递给错误处理器。这要求您区分错误和异常。如果您希望将错误当作常规异常处理,可以通过告知错误处理器将所有PHP错误转换为适当的异常来实现。不要忘记启用异常处理,否则您将无法再处理它们。

$errorHandler = new ErrorHandler();
$errorHandler->convertErrorsToExceptions();
$errorHandler->enableExceptionHandling();

// or

$errorHandler = new ErrorHandler(true);
$errorHandler->enableExceptionHandling();

现在,例如当发生 E_WARNING 时,您将得到一个 WarningException。要处理所有 WarningException 发生的情况,您可以创建一个常规异常处理器。

$errorHandler->addExceptionHandler(function(WarningException $ex){
    return true;
});

如果您希望在一个处理器中处理所有转换为异常的PHP错误,您可以创建一个针对 IErrorException 接口的异常处理器。

$errorHandler->addExceptionHandler(function(IErrorException $ex) {
    // all kinds of php errors (E_WARNING, E_STRICT, etc.) can now be handled
    // here in form of an exception
    return true;
});

以下是所有可用的异常的完整列表。

上面列出的所有异常都共享同一个 IErrorException 接口,该接口提供了一些getter方法来访问错误信息。

// get numeric representation of the error type (E_WARNING, E_STRICT, etc.)
$ex->getErrorCode();

// get error message
$ex->getErrorMessage();

// get error file
$ex->getErrorFile();

// get error line
$ex->getErrorLine();

// check wether the error was recoverable or not
$ex->isRecoverable();