# 异常处理
路由如果没有匹配到任何页面,会调用配置 error_controller_name 指定的异常处理类,默认为GoController::class。
~~~
public function onExceptionHandle(\Throwable $e)
{
if ($this->whoopsConfig->isEnable() && Server::$instance->getServerConfig()->isDebug()) {
throw $e;
}
if ($this->clientData->getResponse() != null) {
$this->response->withStatus(404);
$this->response->withHeader("Content-Type", "text/html;charset=UTF-8");
if($e instanceof RouteException) {
$msg = '404 Not found / ' . $e->getMessage();
return $msg;
}else if ($e instanceof AccessDeniedException) {
$this->response->withStatus(401);
$msg = '401 Access denied / ' . $e->getMessage();
return $msg;
}else if($e instanceof ResponseException){
$this->response->withStatus(200);
return $this->errorResponse($e->getMessage(), $e->getCode());
}else if ($e instanceof AlertResponseException){
$this->response->withStatus(500);
return $this->errorResponse($e->getMessage(), $e->getCode());
}
}
return parent::onExceptionHandle($e);
}
~~~
# 自定义异常处理
自定义异常处理,有2个时机。
>[info] 如果异常发生时,代码没有执行到控制器里比如404,405,则会调用GoController::onExceptionHandle 的方法进行处理。也就是 error_controller_name 配置的异常处理类。该类需要继承 GoController 。
>[warning] 如果异常发生时,已经执行到控制器里,比如自己throw了一个异常,会优先调用该控制器里的onExceptionHandle 方法。
如果需要自定义错误处理,请注意异常发生的时机。
# 自定义处理异常案例
~~~
<?php
/**
* Created by PhpStorm.
* User: anythink
* Date: 2019/5/31
* Time: 6:26 PM
*/
namespace app\Controller;
use ESD\Go\GoController;
class ExceptionClass extends GoController{
function onExceptionHandle(\Throwable $e)
{
$this->response->withHeader("content-type",'text/html;charset=utf-8');
if($e instanceof \Exception){
return '拦截所有异常';
}
return parent::onExceptionHandle($e); // TODO: Change the autogenerated stub
}
}
~~~
配置文件
~~~
route:
error_controller_name: app\Controller\ExceptionClass
~~~
# 框架提供的可用异常
该异常框架内部不会抛出,均由用户自行使用。
## ResponseException
该异常会被捕获并返回message,code,如果不是ajax请求会返回。
~~~
错误消息
aaa
~~~
如果是ajax请求会返回。
~~~
{
"code": 23333,
"msg": "aaa",
"data": null
}
~~~
## AlertResponseException
该异常会捕获并返回 http500 , 内部服务器错误,日志会记录详细的错误信息,用于系统出现问题的时候调用。
~~~
错误消息
内部服务器错误,请稍后再试
~~~
如果是ajax请求会返回
~~~
{
"code": 500,
"msg": "内部服务器错误,请稍后再试",
"data": null
}
~~~
- 前言
- 捐赠ESD项目
- 使用篇-通用
- 环境
- 安装
- 规范
- 压力测试
- 配置
- 如何设置YML配置
- server配置
- 端口配置
- 项目结构
- 事件派发
- 日志
- 注解
- DI容器
- 自定义进程
- 并发及协程池
- Console插件
- Scheduled插件
- Redis插件
- AOP插件
- Saber插件
- Mysql插件
- mysql事务
- Actuator插件
- Whoops插件
- Cache插件
- PHPUnit插件
- Security插件
- Session插件
- EasyRoute插件
- http路由
- ProcessRpc插件
- AutoReload插件
- AnnotationsScan插件
- Tracing-plugin插件
- MQTT插件
- Pack插件
- AMQP插件
- Validate插件
- Uid插件
- Topic插件
- Blade插件
- CsvReader插件
- hashed-wheel-timer-plugin插件
- 使用篇-HTTP
- 路由
- 静态文件
- 路由定义
- 修饰方法
- 路由分组
- 资源路由
- 端口作用域
- 异常处理
- 跨域请求
- 路由缓存
- 控制器
- 控制器初始化
- 前置操作
- 跳转和重定向
- 异常处理
- 请求
- 请求对象
- 请求信息
- request消息
- response消息
- stream消息
- url接口
- 验证器
- 内置验证器
- 内置过滤器
- 使用篇-WS
- 如何使用
- 路由
- 使用篇-TCP
- 插件篇-PluginSystem
- 微服务篇-ESDCloud
- CircuitBreaker插件
- SaberCloud插件
- 分布式链路追踪系统
- Consul插件