如果方法里使用未定义的字段:
public function aa(){
echo $aa;
}
修改app
目录下的 ExceptionHandle.php
的render
方法,添加自定义的异常处理:
public function render($request, Throwable $e): Response
{
// 添加自定义异常处理机制
return show(config("status.error"), $e->getMessage());
// 其他错误交给系统处理
// return parent::render($request, $e);
}
但是直接修改
app
目录下的配置文件不太好,因为app
目录下的都是common
文件,会作用于所有的应用,如果我们像上面配置为json
格式输出错误,那么如果是模板输出出错也会返回json
格式,所以不合理。
下面以API模块举例:
(1) 还原app
目录下的ExceptionHandle.php
文件;
(2) 在demo
应用下新建exception
文件夹(与controller同级),新建Http.php
类,仿造ExceptionHandle
继承Handle
类,重写render
方法:
Http.php:
namespace app\demo\exception;
use think\exception\Handle;
use think\Response;
use Throwable;
class Http extends Handle
{
public $httpStatus = 500;
/**
* Render an exception into an HTTP response.
*
* @access public
* @param \think\Request $request
* @param Throwable $e
* @return Response
*/
public function render($request, Throwable $e): Response
{
// 添加自定义异常处理机制
return show(config("status.error"), $e->getMessage(), [],$this->httpStatus);
}
}
(3) 然后,复制app
目录下的provider.php
到demo
应用目录,修改think\exception\Handle
配置:
provider.php :
// 容器Provider定义文件
return [
'think\exception\Handle' => 'app\\demo\\exception\\Http',
];
以上就是配置
api
模块的错误信息;如果是后台模板引擎返回报错,可以定义一个自定义错误页面,而不是返回一个json
数据。
在控制器加一个方法throw
一个think\exception\HttpException
异常:
public function aa(){
throw new HttpException(404,"找不到相应的数据");
}
访问结果:
看起来没问题,细心的朋友会发现状态码不太对,我上面抛出的异常设置的状态码是404
,这里的请求是500
,这是为啥呢?
原因是上面自定义异常处理类里面重写的render
方法里面是自定义的状态码$httpStatus=500
:
public $httpStatus = 500;
public function render($request, Throwable $e): Response
{
// 添加自定义异常处理机制
return show(config("status.error"), $e->getMessage(), [],$this->httpStatus);
}
我们把这里返回的状态码换为$e->getStatusCode()
:
return show(config("status.error"), $e->getMessage(), [],$e->getStatusCode());
但是这里的$e->getStatusCode()
只是在throw
异常的时候才有这个方法,比如第一步的输出未知变量的错误就没有这个方法,页面就会报错,所以这里需要修改异常处理类:
修改异常处理类Http.php
,这样两种错误异常都可以正常访问了:
public $httpStatus = 500;
public function render($request, Throwable $e): Response
{
if(method_exists($e, "getStatusCode")){
$httpStatus = $e->getStatusCode();
}else{
$httpStatus = $this->httpStatus;
}
// 添加自定义异常处理机制
return show(config("status.error"), $e->getMessage(), [],$httpStatus);
}