Spring boot 入门教程-全局异常处理及日志输出

全局异常处理这里主要用到 @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 异常按级别输出到文件



    
    

    
        
            [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] --%mdc{client}%msg%n
        
    

    

    
        ${PATH}/info.log
        
            logs/info.%d{yyyy-MM-dd}.log
        
        
            [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n
        
        
            INFO
            ACCEPT
            DENY
        
    

    
        ${PATH}/debug.log
        
            logs/debug.%d{yyyy-MM-dd}.log
        
        
            [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n
        
        
            DEBUG
            ACCEPT
            DENY
        
    


    
        ${PATH}/warn.log
        
            logs/warn.%d{yyyy-MM-dd}.log
        
        
            [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n
        
        
            WARN
            ACCEPT
            DENY
        
    



    
        ${PATH}/error.log
        
            logs/error.%d{yyyy-MM-dd}.log
        
        
            [%date{yyyy-MM-dd HH:mm:ss}] [%-5level] [%logger:%line]--%mdc{client} %msg%n
        
        
            ERROR
            ACCEPT
            DENY
        
    

    
        
        
        
        
    
    
        
    

 

 

你可能感兴趣的:(spring,Boot系列)