weew / error-handler
PHP的错误处理器。
Requires
- weew/helpers-array: ^1.0
- weew/helpers-string: ^1.0
Requires (Dev)
- phpunit/phpunit: ^4.7
- satooshi/php-coveralls: ^0.6.1
- weew/http-client: ^1.1
- weew/http-server: ^1.0
README
目录
安装
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();