这里任务三点要求
1.是异常统一处理
2.是返回格式必须是json格式
3.打印日志信息
这里首先要明确一点就是程序员在写代码时候肯定没解决的问题都是
throw newException();进行抛出去的只要明确这一点。
第二点就是什么是json格式我们必须清楚
{ error: "system error", code: "0001", msg: "系统错误" }
第三点要明确知道日志信息如何打印。
这里我先给出具体代码在进行解释说明
首先我给出json格式如何解决的问题,如果是类返回页面直接是json格式,但是这里是json类,没办法我是通过toString方法直接重新写了json格式,然后调用这个方法,返回解释json格式了
这里还是提醒一下做统一异常处理的人,我的经验,统一异常处理并不是处处都可以,就比如过滤器和拦截器,因为在走在项目之前,会先走过滤器和拦截器,因为项目中的统一异常还没走,所以统一异常处理是拦截不了,你如果想处理,只能抛出来自己解决。没办法
packagecom.zenhome.cloud2cloud.config.Exception;
/**
* Created by Qian on 2017/3/14.
*/
public enumErrorInfos {
SPRINGSERVER_ERROR("0001","system error","系统错误"),
NULLPOINTER("0002","null pointer","系统错误"),
NUMBERSINABNORMAL("0003","numbers in abnormal","系统错误");
privateStringcode;
privateStringmsg;
privateStringerror;
privateErrorInfos(String code, String error, String msg) {
this.error=error;
this.code= code;
this.msg= msg;
}
publicString getCode() {
returncode;
}
publicString getMsg() {
returnmsg;
}
publicString getError() {
returnerror;
}
publicString toString(){
return"{ "+"error: "+"\""+error+"\""+", code: "+"\""+code+"\""+", msg: "+"\""+msg+"\""+" }";
}
}
这里在给出正式解决统一异常处理
新建一个类GlobalDefaultExceptionHandler,
在class注解上@ControllerAdvice,
在方法上注解上@ExceptionHandler(value = Exception.class),具体代码如下:staticLoggerlogger= LogManager.getLogger(GlobalExceptionHandler.class.getName());
这句话相当于声明日志信息可以调用,日志具体信息我在最后会给出
e.getClass().isInstance(NullPointerException.class判断错误信息是否一致,一致就打印信息
logger.warn("错误提示"+e.getMessage());控制台打印日志错误信息
String error= ErrorInfos.SPRINGSERVER_ERROR.toString();这就是json格式调用toString方法
packagecom.zenhome.cloud2cloud.config.Exception;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
importorg.springframework.web.bind.annotation.ControllerAdvice;
importorg.springframework.web.bind.annotation.ExceptionHandler;
importorg.springframework.web.bind.annotation.ResponseBody;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
* Created by Qian on 2017/3/13.
*/
@ControllerAdvice
public classGlobalExceptionHandler {
staticLoggerlogger= LogManager.getLogger(GlobalExceptionHandler.class.getName());
@ExceptionHandler(value = Exception.class)
@ResponseBody
publicString jsonErrorHandler(HttpServletRequest req, HttpServletResponse res, Exception e)throwsException {
logger.warn("错误提示"+e.getMessage());
if(e.getClass().isInstance(NullPointerException.class)){
String error= ErrorInfos.NULLPOINTER.toString();
returnerror;
}else if(e.getClass().isInstance(NumberFormatException.class)){
String error= ErrorInfos.NUMBERSINABNORMAL.toString();
returnerror;
}else{
String error= ErrorInfos.SPRINGSERVER_ERROR.toString();
returnerror;
}
}
}
这里我给出实体类吧
可以测试的
packagecom.zenhome.cloud2cloud.config.Exception;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;
importjava.util.HashMap;
importjava.util.Map;
/**
* 测试错误能否丢出去统一处理
*/
@RestController
public classControl {
@RequestMapping("/json3")
public voidjson3(intx)throwsException{
Map map =newHashMap();
try{
inta =100/x;
}catch(Exception e) {
throw newException();
}
}
}
最后给出打印日志的具体详解用法
packagecom.didispace.demo;
importorg.apache.log4j.Level;
importorg.apache.log4j.LogManager;
importorg.apache.log4j.Logger;
/**
* Created by Qian on 2017/3/15.
*/
public classHello {
/* static Logger logger = LogManager.getLogger(Hello.class.getName());*/
/* public boolean hello() {
*//* logger.entry();*//* //trace级别的信息,单独列出来是希望你在某个方法或者程序逻辑开始的时候调用,和logger.trace("entry")基本一个意思
logger.error("Did it again!"); //error级别的信息,参数就是你输出的信息
logger.info("我是info信息"); //info级别的信息
logger.debug("我是debug信息");
logger.warn("我是warn信息");
logger.fatal("我是fatal信息");
logger.log(Level.DEBUG, "我是debug信息"); //这个就是制定Level类型的调用:谁闲着没事调用这个,也不一定哦!
*//* logger.exit();*//* //和entry()对应的结束方法,和logger.trace("exit");一个意思
return false;
}*/
}