星河避难所

返回

Webman 错误控制Blur image

在 Webman 中,控制错误返回可以通过全局异常处理器(ExceptionHandler)来处理。你可以自定义异常处理逻辑,根据不同的异常类型或错误,返回不同的 HTTP 响应状态码和错误信息。以下是一个实现方式的示例:

自定义全局异常处理器#

你可以定义自己的异常处理器,例如创建一个 app/exception/Handler.php ,继承 Webman 提供的 ExceptionHandlerInterface

<?php
namespace app\exception;

use Throwable;
use Webman\Http\Response;
use Webman\Http\Request;
use Webman\Exception\ExceptionHandlerInterface;

class Handler implements ExceptionHandlerInterface
{
    // 定义不需要记录日志的异常类型
    public $dontReport = [
        // 在这里可以定义不需要记录日志的异常类型
        \Illuminate\Validation\ValidationException::class,
        // 例如自定义业务逻辑异常
        \app\exception\BusinessException::class,
    ];

    /**
     * 处理异常的方法
     *
     * @param Request $request
     * @param Throwable $exception
     * @return Response
     */
    public function render(Request $request, Throwable $exception): Response
    {
        // 检查是否为自定义的业务异常
        if ($exception instanceof \app\exception\BusinessException) {
            return response(json(['error' => $exception->getMessage()], 400));
        }

        // 默认返回500错误
        return response(json(['error' => 'Server Error'], 500));
    }

    /**
     * 记录异常日志的方法
     *
     * @param Throwable $exception
     * @return void
     */
    public function report(Throwable $exception)
    {
        // 如果异常不在 dontReport 中,就记录日志
        if (!$this->shouldntReport($exception)) {
            echo $exception; // 这里可以使用你喜欢的日志系统记录错误
        }
    }

    /**
     * 判断是否应该记录异常
     *
     * @param Throwable $exception
     * @return bool
     */
    protected function shouldntReport(Throwable $exception): bool
    {
        foreach ($this->dontReport as $type) {
            if ($exception instanceof $type) {
                return true;
            }
        }
        return false;
    }
}
php

在配置文件中指定异常处理器#

config/exception.php 中,你可以指定这个异常处理器:

return [
    'exception_handler' => app\exception\Handler::class,
];
php

自定义异常类#

你可以根据需求定义自己的业务异常类,例如:

<?php
namespace app\exception;

use Exception;

class BusinessException extends Exception
{
    public function __construct($message = "业务逻辑异常", $code = 400)
    {
        parent::__construct($message, $code);
    }
}
php

返回自定义错误响应#

当某个操作出现业务错误时,你可以抛出自定义异常,比如:

use app\exception\BusinessException;

throw new BusinessException("自定义的业务错误信息", 400);
php

这样,Webman 会根据你在全局异常处理器中定义的逻辑,返回相应的错误信息和 HTTP 状态码。

总结#

通过自定义全局异常处理器,你可以灵活地控制 Webman 应用中的错误返回,能够根据不同的异常类型返回不同的错误信息,并记录相应的日志。

Webman 错误控制
https://hejunjie.life/blog/8f2a61e0
作者 何俊杰
发布时间 2024年10月4日
版权信息 CC BY-NC-SA 4.0
评论似乎卡住了,尝试刷新?✨