简介
Swoft 拥有完善的异常错误处理机制,与 FPM 模式有所不同。Swoft 根据不同的场景类型将错误进行了区分。因此你无需关心在不同场景下的错误如何处理,只需实现对应场景的错误处理逻辑即可。Swoft 会自动调度对应的错误处理器。
异常处理
通常我们把异常类放置 app/Exception 目录下 ,异常类处理器放置 app/Exception/Handler 目录下. 异常分为两部分。自定义的 Exception 异常类,和异常处理类 ExceptionHandler
我们可以自定义异常处理逻辑,例如程序出错了,在自己的异常类里上报给服务器,并给用户友好的提示.
两个简单的示例
验证器异常的处理
文件 App/Exception/Handler/ValidatorExceptionHandler.php
<?php declare(strict_types=1);
namespace App\Exception\Handler;
use Swoft\Error\Annotation\Mapping\ExceptionHandler;
use Swoft\Http\Message\Response;
use Swoft\Http\Server\Exception\Handler\AbstractHttpErrorHandler;
use Swoft\Validator\Exception\ValidatorException;
/**
* Class ValidatorExceptionHandler
*
* @since 2.0
*
* @ExceptionHandler(ValidatorException::class)
*/
class ValidatorExceptionHandler extends AbstractHttpErrorHandler
{
/**
* @param Throwable $except
* @param Response $response
*
* @return Response
*/
public function handle(Throwable $except, Response $response): Response
{
//这里做相关逻辑,例如上报
$data = [
'status' =>500,
'data' => $except->getMessage(),
'info' => "参数验证失败"
];
return $response->withData($data);
}
}
上面我们定义了一个异常处理类,记得要使用注解 @ExceptionHandler 将类指定为异常处理器。参数是要处理的异常类,需提供完整类名或在顶部 use,我们这里就是使用的 use 方式.推荐使用 use的方式,代码更加整洁.
下面是验证器不通过的返回示例,是我们自定义的格式.
定义异常前返回的数据格式
{
"message": "订单状态不能空"
}
定义异常后返回的自定义的格式
{
"status": 500,
"data": "订单状态不能空",
"info": "参数验证失败"
}
其他系统异常都可以像验证器异常一样,自定义处理逻辑,只需要修改 @ExceptionHandler 注解中的参数,改为你需要处理的异常,同时定义相关的 handle 方法来处理异常
自定义错误及处理
定义异常类
文件位置 App/Exception/ApiException.php
<?php
namespace App\Exception;
/**
* Class ApiException
*
* @since 2.0
*/
class ApiException extends \Exception
{
}
自定义异常类只需要继承 Exception 就可以了.
定义异常处理类
文件位置 App/Exception/Handler/ApiExceptionHandler.php
<?php declare(strict_types=1);
namespace App\Exception\Handler;
use App\Exception\ApiException;
use Swoft\Error\Annotation\Mapping\ExceptionHandler;
use Swoft\Http\Message\Response;
use Swoft\Http\Server\Exception\Handler\AbstractHttpErrorHandler;
use Throwable;
/**
* Class ApiExceptionHandler
*
* @since 2.0
*
* @ExceptionHandler(ApiException::class)
*/
class ApiExceptionHandler extends AbstractHttpErrorHandler
{
/**
* @param Throwable $except
* @param Response $response
*
* @return Response
*/
public function handle(Throwable $except, Response $response): Response
{
$data = [
'code' =>500,
'error' => $except->getMessage(),
'info' => "api访问出现异常"
];
// 上报服务器
return $response->withData($data);
}
}
自定义异常的使用
namespace App\Http\Controller;
use App\Exception\ApiException;
use Swoft\Http\Server\Annotation\Mapping\Controller;
use Swoft\Http\Server\Annotation\Mapping\RequestMapping;
use Throwable;
/**
* @Controller(prefix="ex")
*/
class ExceptionController
{
/**
* @RequestMapping(route="api")
*
* @throws ApiException
*/
public function api(): void
{
throw new ApiException('api of ExceptionController');
}
}
上面示例就在控制器中使用了自定义异常.在我们的项目中,可以针对不同的业务场景抛出不同的异常,然后针对不同的异常进行针对性的处理.