# :-: 异常处理
```
通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。 通常情况下我们用try.....catch....对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂, 我们希望代码中只有业务相关的操作,所有的异常我们单独设立一个类来处理它。全局异常就是对框架所有异常进行统一管理。 我们在可能发生异常的方法里throw抛给控制器。然后由全局异常处理器对异常进行统一处理。 如此,我们的Controller中的方法就可以很简洁了。
```
所谓全局异常处理器就是使用@ControllerAdvice注解。示例如下:
~~~
package com.hjf.common.exception;
import com.hjf.common.config.CodeUtil;
import com.hjf.common.base.BaseResp;
import com.hjf.common.util.JsonUtil;
import com.hjf.common.util.web.ResponseUtils;
import com.hjf.core.spring.WebUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/**
* 全局异常处理类
*/
@ResponseBody
@ControllerAdvice
@Slf4j
public class MyControllerAdvice {
/**
* 参数校验异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public BaseResp MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
// 从异常对象中拿到ObjectError对象
ObjectError objectError = e.getBindingResult().getAllErrors().get(0);
// 然后提取错误提示信息进行返回
log.error("【参数校验异常处理】"+objectError.getDefaultMessage());
return BaseResp.failMsg(objectError.getDefaultMessage());
}
/**
* 通用异常处理
*/
@ExceptionHandler(value = Exception.class)
public void errorHandle(Exception e){
log.error("【系统异常处理】"+e.getMessage());
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", CodeUtil.error);
map.put("msg","抱歉系统发生了点小问题");
String json= JsonUtil.obj2Json(map);
ResponseUtils.renderJson(WebUtils.getResponse(), json);
}
// /**
// * 通用异常处理
// */
// @ExceptionHandler(value = Exception.class)
// public Map<String,Object> errorHandle(Exception e){
// log.error("【系统异常处理】"+e.getMessage());
// Map<String,Object> map = new HashMap<String,Object>();
// map.put("code", CodeUtil.error);
// map.put("msg","抱歉系统发生了点小问题");
// return map;
// }
// /**
// * 通用异常处理
// */
// @ExceptionHandler(value = CommonException.class)
// public Map<String,Object> commonErrorHandle(Exception e){
// log.error("【通用异常处理】"+e.getMessage());
// Map<String,Object> map = new HashMap<String,Object>();
// map.put("code", CodeUtil.error);
// map.put("msg",e.getMessage());
// return map;
// }
/**
* 通用异常处理
*/
@ExceptionHandler(value = CommonException.class)
public void commonErrorHandle(Exception e){
log.error("【通用异常处理】"+e.getMessage());
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", CodeUtil.error);
map.put("msg",e.getMessage());
String json= JsonUtil.obj2Json(map);
ResponseUtils.renderJson(WebUtils.getResponse(), json);
}
}
~~~
- 项目介绍
- 项目声明
- 项目简介
- 架构设计
- 项目亮点功能介绍
- 技术栈介绍
- 核心功能
- 运行环境
- 项目更新日志
- 文档更新日志
- F&Q
- 部署教程
- 环境准备
- JDK安装
- JDK1.8,17共存
- maven
- 分布式缓存Redis
- 单机版
- 集群
- 注册&配置中心alibaba/nacos
- 介绍
- Nacos安装
- Nacos配置中心
- Nacos注册发现
- Nacos生产部署方案
- 服务监控-BootAdmin
- 基本介绍
- 如何使用
- 整合Admin-Ui
- 客户端配置
- 链路追踪
- 基本介绍
- SkyWalking-1
- Skywalking-1
- 消息队列
- Kafka
- docker安装kafka
- Linux集群
- Maven私服
- nexus安装部署
- nexus使用介绍
- 全文搜索elasticsearch
- windows集群搭建
- docker安装es
- ElasticHD
- linux集群部署
- 统一日志解决方案
- 日志解决方案设计
- 介绍与相关资料
- ELK安装部署
- elasticsearch 7.5
- logstash-7.5
- kibana-7.5
- filebeat
- 服务监控-Prometheus
- Prometheus安装配置
- Prometheus介绍
- grafana
- 持续集成部署CICD
- 自动化部署Jenkins
- 安装部署win
- 打包发布远程执行
- 安装部署linux
- jenkins+gitlab+docker容器化工程自动化部署
- Git
- CICD说明
- 阿里云效
- CentOS_MYSQL安装
- docker
- 安装
- Docker安装Nginx
- Docker部署启动springboot
- dockerCompose
- harbor
- Docker私有镜像仓库
- Portainer
- Docker远程连接设置
- 打包工程
- 必要启动模块
- 核心模块
- 登录认证
- 缓存功能
- 日志模块
- 分布式锁
- 消息队列
- 异常处理
- 系统接口
- 参数验证
- es检索
- 数据导出
- 系统设计
- 系统总体架构
- 扩展模块(可选)
- 限流熔断alibaba/sentinel
- 使用Sentinel实现gateway网关及服务接口限流
- Sentinel使用Nacos存储规则及同步
- 服务调用Feign
- Feign基本介绍
- 如何使用
- 负载均衡
- 请求超时
- 请求拦截器
- 分布式任务调度
- XXL-JOB
- 分布式事务
- TX-LCN
- Seata
- Seata原理解析
- 数据库分库分表
- swagger文档
- 分布式ID生成器解决方案
- 服务网关CloudGateway
- 基本介绍
- 使用网关
- 路由配置
- 全局过滤器
- 服务认证授权架构设计
- 认证服务流程
- 授权服务流程
- 系统幂等性设计与实践
- 分布式日志链路跟踪
- 实时搜索系统设计
- 应用性能
- 压力测试工具
- Apache JMeter介绍和安装
- ApacheJMeter使用
- JVM
- JVM性能调优
- 常见JVM内存错误及解决方案
- JVM 分析工具详解
- Spring Cloud性能调优
- Linux运维
- Linux 常用命令
- Linux开启端口