插件地址:https://www.workerman.net/plugin/16
composer require tinywan/exception-handler
config/exception.php
return [
// 这里配置异常处理类
'' => \Tinywan\ExceptionHandler\Handler::class,
];
多应用模式时,你可以为每个应用单独配置异常处理类,参见多应用
请求参数错误
use support\Request;
use support\Response;
use Tinywan\ExceptionHandler\Exception\BadRequestHttpException;
class Token{
public function issueToken(Request $request): Response
{
$params = $request->post();
if (empty($params)) {
throw new BadRequestHttpException('账号或密码不能为空');
}
}
}
以上异常抛出错误信息,如下格式:
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code": 0,
"msg": "账号或密码不能为空",
"data": {},
}
所有返回的异常信息将以json格式返回,以上为
返回简略的异常信息
所有的异常错误处理器根据配置文件 config/app.php
中debug
的值来调整错误显示, 当debug
值为true
(表示在调试模式), 错误处理器会显示异常以及详细的函数调用栈和源代码行数来帮助调试,将返回详细的异常信息。 当debug
值为false
,只有错误信息会被显示以防止应用的敏感信息泄漏,将返回简略的异常信息。
返回详细的异常信息
HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=utf-8
{
"code": 0,
"msg": "password不允许为空",
"data": {
"request_url": "POST //127.0.0.1:8888/oauth/issue-token",
"timestamp": "2022-03-06 15:19:12",
"client_ip": "172.18.0.1",
"request_param": {
"username": "webman"
},
"error_message": "password不允许为空",
"error_trace": "#0 /var/www/webman-admin/app/functions.php(68): Tinywan\\Validate\\Validate->check(Array)\n#1 /var/www/webman-admin/app/controller/Authentication.php(25): ..."
}
}
自定义一个:405 Method Not Allowed
(表示:请求行中指定的请求方法不能被用于请求相应的资源)
自定义异常类只需要继承Tinywan\ExceptionHandler\Exception\BaseException
类即可
<?php
declare(strict_types=1);
namespace support\exception;
use Tinywan\ExceptionHandler\Exception\BaseException;
class MethodNotAllowedException extends BaseException
{
/**
* @var int
*/
public int $statusCode = 405;
/**
* @var string
*/
public string $errorMessage = '请求行中指定的请求方法不能被用于请求相应的资源';
}
use support\Request;
use support\Response;
use support\exception\MethodNotAllowedException;
class Token{
public function issueToken(Request $request): Response
{
$params = $request->post();
if (empty($params)) {
throw new MethodNotAllowedException();
}
}
}
使用postman请求截图
ValidateException
JwtTokenException
更多:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
src/Handler.php
文件90行和97行,如果读不到配置会报错,建议加上默认空数组值。本来在中间件里设置了跨源处理,这个异常出错了就无法返回信息了,这个要怎么处理?
已经解决了,重新建了一个类,继承Tinywan\ExceptionHandler\Handler,重写了buildResponse方法
高
BadRequestHttpException 返回的code状态码如何更改呢?
BadRequestHttpException 返回的code状态码如何更改呢?
感谢回复,昨天我已经搞明白了。
"Server Unknown Error" 应该怎么处理这种保存呢
他没有显示报错的具体内容。
好了好了,我找到了
好的
怎么处理呀
很棒的插件,大佬 Handler::class 可以加一个可选项,异常上报Sentry
欢迎提交PR哈!
这些额外的信息不需要返回给客户端,怎么去掉呢
返回会有什么问题吗?这主要是一些请求参数
将 buildResponse 返回的data 值给于空值就好了
噢噢
还有一个调试模式下
这个怎么不会显示实际的错误信息
调试模式下就在详细的调试日志
在同时安装illuminate/events和webman/log的情况下,抛出异常会被webman/log记录为SQL异常日志,实际写入日志是在webman/log插件里写入
日志信息如下
目前处理方式是
哇!这个真的好好用