版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27828675/article/details/80844393
全局异常处理这里主要用到 @ControllerAdvice
1.自定义异常处理类
import lombok.Data;
/**
* @Description: 自定义异常
*/
@Data
public class CommonException extends RuntimeException {
public CommonException(int code, String msg) {
this.code = code;
this.msg = msg;
}
private int code;
private String msg;
}
注意:这里省略了setter/getter,使用了lombok 插件@Data注解,这里不再赘述。
2.全局异常处理类
@Slf4j
@RestControllerAdvice
public class CommonExceptionHandler {
/**
* 全局异常捕捉处理
* @param ex
* @return
*/
@ExceptionHandler(value = Exception.class)
public Map errorHandler(HttpServletRequest req,Exception ex) {
Map map = new HashMap();
map.put("code", 100);
map.put("message", ex.getMessage());
map.put("url", req.getRequestURL());
map.put("params", req.getParameterMap());
log.error("发生未处理的异常={}",ex.getMessage(),ex);
return map;
}
/**
* 拦截捕捉自定义异常 MyException.class
* @param ex
* @return
*/
@ExceptionHandler(value = CommonException.class)
public Map myErrorHandler(HttpServletRequest req, CommonException ex) {
Map map = new HashMap();
map.put("code", ex.getCode());
map.put("message", ex.getMsg());
map.put("url", req.getRequestURL());
map.put("params", req.getParameterMap());
return map;
}
}
3.controller
@RequestMapping(value = "/login",method = RequestMethod.POST)
public UserBase login(@RequestParam String account) {
UserBase result = null;
try {
result = userBaseService.userLogin(account);
} catch (Exception e) {
log.error("用户登录异常={}",e.getMessage(),e);
throw new CommonException(500,"内部错误");
}
return result ;
}
4.测试
请求:get方式:http://localhost:18080/userBase/login?account=111111
返回:{
"code": 100,
"message": "Request method 'GET' not supported",
"params": {
"account": [
"111111"
]
},
"url": "http://localhost:18080/userBase/login"
}
表明是全局异常捕获:errorHandler方法执行.
关掉数据库,制造异常采用 post 请求
返回:{
"code": 500,
"message": "内部异常",
"params": {
"account": [
"18612908620"
]
},
"url": "http://localhost:18080/userBase/login"
}
表明自定义异常捕获成功!
附:logback.xml 异常按级别输出到文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 修改一下路径-->
<property name="PATH" value="logs"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] --%mdc{client}%msg%n</Pattern>
</encoder>
</appender>
<!--<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/trace.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
</appender>-->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/info.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/info.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/debug.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/debug.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/warn.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/warn.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>logs/error.%d{yyyy-MM-dd}.log</FileNamePattern>
</rollingPolicy>
<layout>
<pattern>[%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<root level="TRACE">
<appender-ref ref="INFO_FILE" />
<appender-ref ref="DEBUG_FILE" />
<appender-ref ref="WARN_FILE" />
<appender-ref ref="ERROR_FILE" />
</root>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>