tobento / service-error-handler
PHP 错误和异常处理
1.0.4
2023-02-05 15:00 UTC
Requires
- php: >=8.0
- psr/container: ^2.0
- psr/log: ^1|^2|^3
- tobento/service-autowire: ^1.0
- tobento/service-view: ^1.0
Requires (Dev)
- monolog/monolog: ^2.3
- phpunit/phpunit: ^9.5
- tobento/service-container: ^1.0
- vimeo/psalm: ^4.0
README
错误处理服务提供管理错误和异常的工具。
目录
入门
运行以下命令添加错误处理服务项目的最新版本。
composer require tobento/service-error-handler
要求
- PHP 8.0 或更高版本
亮点
- 框架无关,适用于任何项目
- 解耦设计
文档
错误处理
查看异常处理器以了解更多关于异常处理器的信息。
use Tobento\Service\ErrorHandler\ErrorHandling; use Tobento\Service\ErrorHandler\ThrowableHandlers; use Tobento\Service\ErrorHandler\ThrowableHandlerFactory; use Tobento\Service\ErrorHandler\Handler; $throwableHandlers = new ThrowableHandlers(new ThrowableHandlerFactory()); // adding any handler: // $throwableHandlers->add(ValidationExceptionHandler::class); // $throwableHandlers->add(GeneralExceptionHandler::class); // only on development: $throwableHandlers->add(Handler\Debug::class); // adding last: $throwableHandlers->add(Handler\Errors::class); (new ErrorHandling($throwableHandlers))->register();
异常处理器
异常处理器可以用于需要处理异常的任何地方。
创建异常处理器
use Tobento\Service\ErrorHandler\ErrorHandling; use Tobento\Service\ErrorHandler\ThrowableHandlers; use Tobento\Service\ErrorHandler\ThrowableHandlersInterface; use Tobento\Service\ErrorHandler\ThrowableHandlerFactory; $throwableHandlers = new ThrowableHandlers(new ThrowableHandlerFactory()); var_dump($throwableHandlers instanceof ThrowableHandlersInterface); // bool(true)
使用自动装配工厂
如果您需要使用依赖项添加异常处理器,则需要自动装配工厂。
use Tobento\Service\ErrorHandler\ErrorHandling; use Tobento\Service\ErrorHandler\ThrowableHandlers; use Tobento\Service\ErrorHandler\ThrowableHandlersInterface; use Tobento\Service\ErrorHandler\AutowiringThrowableHandlerFactory; // Any PSR-11 container $container = new \Tobento\Service\Container\Container(); $throwableHandlers = new ThrowableHandlers( new AutowiringThrowableHandlerFactory($container) ); var_dump($throwableHandlers instanceof ThrowableHandlersInterface); // bool(true)
添加异常处理器
通过类实例
$throwableHandlers->add(new Handler\Errors());
通过类名
$throwableHandlers->add(Handler\Errors::class);
通过类名和内置参数(无法由自动装配解析)
$throwableHandlers->add([ThrowableHandler::class, 'name' => 'value']);
通过匿名函数
use Throwable; $throwableHandlers->add(function(Throwable $t): mixed { // Return throwable if cannot handle, otherwise anything else. return $t; });
限制异常处理器
通过错误级别
异常处理器仅会在指定的错误级别上使用。
$throwableHandlers->add(ThrowableHandler::class) ->level(\E_USER_WARNING, \E_WARNING);
通过异常
异常处理器仅会在指定的异常上使用。
$throwableHandlers->add(ThrowableHandler::class) ->handles(SomeException::class, AnotherException::class);
优先级异常处理器
您可以通过以下方式按以下方式(从高到低)优先排序处理器的执行顺序
$throwableHandlers->add(ThrowableHandler::class) ->priority(1000); // is default
处理异常
use Throwable; try { // do something } catch (Throwable $t) { // do something with the response: $response = $throwableHandlers->handleThrowable($t); }
处理器
调试
调试处理器将在任何未捕获的异常上渲染调试页面。
use Tobento\Service\ErrorHandler\Handler\Debug; use Tobento\Service\View\ViewInterface; use Tobento\Service\ErrorHandler\ThrowableHandlerInterface; $debug = new Debug( view: null, // null|ViewInterface ); var_dump($debug instanceof ThrowableHandlerInterface); // bool(true)
自定义视图
查看视图服务以了解更多关于视图的信息。
private/
view/
debug/
error.php
throwable.php
use Tobento\Service\ErrorHandler\Handler\Debug; use Tobento\Service\View\ViewInterface; use Tobento\Service\View\View; use Tobento\Service\View\PhpRenderer; use Tobento\Service\Dir\Dirs; use Tobento\Service\Dir\Dir; $view = new View( new PhpRenderer( new Dirs( new Dir('/private/view'), ) ) ); $debug = new Debug( view: $view, // null|ViewInterface );
错误
错误处理器将在关闭时渲染错误页面。
use Tobento\Service\ErrorHandler\Handler\Errors; use Tobento\Service\View\ViewInterface; use Tobento\Service\ErrorHandler\ThrowableHandlerInterface; $errors = new Errors( view: null, // null|ViewInterface ); var_dump($errors instanceof ThrowableHandlerInterface); // bool(true)
自定义错误视图
查看视图服务以了解更多关于视图的信息。
private/
view/
error.php
use Tobento\Service\ErrorHandler\Handler\Errors; use Tobento\Service\View\ViewInterface; use Tobento\Service\View\View; use Tobento\Service\View\PhpRenderer; use Tobento\Service\Dir\Dirs; use Tobento\Service\Dir\Dir; $view = new View( new PhpRenderer( new Dirs( new Dir('/private/view'), ) ) ); $errors = new Errors( view: $view, // null|ViewInterface );
日志
日志处理器将记录任何错误或异常。
use Tobento\Service\ErrorHandler\Handler\Log; use Psr\Log\LoggerInterface; use Monolog\Logger; use Monolog\Handler\TestHandler; use Tobento\Service\ErrorHandler\ThrowableHandlerInterface; $logger = new Logger('name'); $logger->pushHandler(new TestHandler()); $log = new Log( logger: $logger, // Closure|LoggerInterface ); var_dump($log instanceof ThrowableHandlerInterface); // bool(true)
使用闭包和异常处理器的示例
use Tobento\Service\ErrorHandler\Handler\Log; use Psr\Log\LoggerInterface; use Monolog\Logger; use Monolog\Handler\TestHandler; $throwableHandlers->add(new Log(function(): LoggerInterface { $logger = new Logger('name'); $testHandler = new TestHandler(); $logger->pushHandler($testHandler); return $logger; }))->levels(E_ERROR, E_CORE_ERROR);