全局异常处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import com.alibaba.fastjson.JSONObject;
import com.banksteel.openerp.commons.exception.BuzzErrorException;
import com.banksteel.openerp.commons.framework.entiy.ResponseEntity;
import com.banksteel.openerp.commons.framework.exception.BncErrorException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
import java.util.UUID;

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler{

@Autowired
private AmqpTemplate amqpTemplate;

//private static Properties exceptionCodes = null;
//private static String exceptionCodePath = "exceptionCode.properties";
//private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

/*static {
loadProperties();
}*/

/* private static void loadProperties(){
try {
exceptionCodes = new Properties();
InputStream inputStream = GlobalExceptionHandler.class.getClassLoader().getResourceAsStream(exceptionCodePath);
if (inputStream != null){
InputStreamReader isr = new InputStreamReader(inputStream, "UTF-8");
exceptionCodes.load(isr);
}
} catch (Exception e) {
logger.error("HandleException 初始化异常", e);
}
}*/

@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest request,HttpServletResponse response, Exception ex) throws Exception {
String trackId = UUID.randomUUID().toString().replace("-", "");
log.error("defaultErrorHandler->全局拦截异常信息,trackId={},AmqpTemplate={},{}",trackId , amqpTemplate ,request, ex);
//推异常日志队列
//TODO
log.error("defaultErrorHandler->全局拦截异常信息,trackId={}",trackId , ex);
ErrorMessage mess = getMessage(ex);
ResponseEntity result = returnException(mess);
result.setResult("trackId="+trackId);
try {
response.setContentType("text/plain; charset=UTF-8");
response.getWriter().write(JSONObject.toJSONString(result));
} catch (IOException e) {
log.error("返回异常",e.getMessage());
}
return new ModelAndView();
}

/**
* @description:组装异常后的返回信息
* @param mess
* @return
* @author:商家进销存项目组 xuxp
* @createTime:2017年1月11日 下午3:44:16
*/
private ResponseEntity returnException(ErrorMessage mess) {
ResponseEntity responseEntity = new ResponseEntity();
String errorDetail = "";
if(mess!=null) {
responseEntity.setCode(mess.errorCode);
responseEntity.setMess(mess.message);
errorDetail = mess.getErrorMsgDetail() == null ? "" : mess.getErrorMsgDetail().toString();
}else{
responseEntity.setCode(500);
responseEntity.setMess("系统返回异常");
}
Calendar calendar = Calendar.getInstance(Locale.CHINA);
responseEntity.setTimeStamp(calendar.getTimeInMillis());
responseEntity.setResult("exception");

responseEntity.setData(errorDetail);
return responseEntity;
}

private ErrorMessage getMessage(Throwable th) {
ErrorMessage mess = null;
if (th instanceof BuzzErrorException){
BuzzErrorException buzzErrorException = (BuzzErrorException)th;
mess = new ErrorMessage(buzzErrorException.getErrorCode(),buzzErrorException.getMessage());
} else if (th instanceof BncErrorException) {
BncErrorException bncErrorException = (BncErrorException)th;
mess = new ErrorMessage(4002,bncErrorException.getMessage());
} else if (th.getCause() != null){
mess = getMessage(th.getCause());
}else {
ErrorMsgDetail errorMsgDetail = getErrorMsgDetail(th);
String exceptionMsg = errorMsgDetail.getExceptionMsg();
boolean hasMsg = StringUtils.isBlank(exceptionMsg) || exceptionMsg.equals("null") || exceptionMsg.length() > 100;
mess = new ErrorMessage(500, hasMsg ? "系统异常,请联系管理员!" : exceptionMsg);
}
return mess;
}

private ErrorMsgDetail getErrorMsgDetail(Throwable th) {
Class<? extends Throwable> clazzException = th.getClass();
String clazzExStr = null == clazzException ? "" : clazzException.toString();
String message = th.getMessage();
String stackExStr = "";
StackTraceElement[] stackTrace = th.getStackTrace();
if (null != stackTrace && stackTrace.length > 0) {
stackExStr = stackTrace[0].toString();
}

return new ErrorMsgDetail(clazzExStr, message, stackExStr);
}

/* private ErrorMessage getMessage(Class thClazz, String errMsg) {
ErrorMessage mess = null;

String code = exceptionCodes.getProperty(thClazz.getName());

if (StringUtils.contains(code,",")){
String[] values = code.split(",");
int errorCode = 500;
try{
errorCode = Integer.parseInt(values[0]);
}catch (NumberFormatException e){

}
String errorMsg = StringUtils.isNotEmpty(errMsg) && errorCode != 500 ? errMsg : values[1];

mess = new ErrorMessage(errorCode,errorMsg);
}
return mess;
}
*/


private class ErrorMessage {
private int errorCode;
private String message;
private ErrorMsgDetail errorMsgDetail;

public ErrorMessage(int errorCode, String message) {
this.errorCode = errorCode;
this.message = message;
}
public ErrorMessage(int errorCode, String message, ErrorMsgDetail errorMsgDetail) {
this.errorCode = errorCode;
this.message = message;
this.errorMsgDetail = errorMsgDetail;
}

public ErrorMsgDetail getErrorMsgDetail() {
return errorMsgDetail;
}
@Override
public String toString() {
return "ErrorMessage [errorCode=" + errorCode + ", message=" + message + ", errorMsgDetail="
+ errorMsgDetail + "]";
}
}

private class ErrorMsgDetail {
private String exceptionClass;
private String exceptionMsg;
private String exceptionStackTrace;

public String getExceptionMsg() {
return exceptionMsg;
}

public ErrorMsgDetail(String exceptionClass, String exceptionMsg, String exceptionStackTrace) {
this.exceptionClass = exceptionClass;
this.exceptionMsg = exceptionMsg;
this.exceptionStackTrace = exceptionStackTrace;
}

@Override
public String toString() {
return "ErrorMsgDetail [exceptionClass=" + exceptionClass + ", exceptionMsg=" + exceptionMsg
+ ", exceptionStackTrace=" + exceptionStackTrace + "]";
}
}
}