swoft2 教程系列-错误处理

简介

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');
 }
}

上面示例就在控制器中使用了自定义异常.在我们的项目中,可以针对不同的业务场景抛出不同的异常,然后针对不同的异常进行针对性的处理.

发布了543 篇原创文章 · 获赞 32 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/weixin_36691991/article/details/105045428