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

1.自定义全局异常处理器

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?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;
}
}

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

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

1
2
3
return [
'exception_handler' => app\exception\Handler::class,
];

3.自定义异常类

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
namespace app\exception;

use Exception;

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

4.返回自定义错误响应

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

1
2
3
4
use app\exception\BusinessException;

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

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

总结

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