全局異常處理
文章目錄
全局異常處理指的是針對程序中產生的Exception進行的處理。產生了異常之後,可以統一跳轉到一個頁面進行錯誤提示,也可以通過Restful形式返回錯誤信息。
全局錯誤指的是對http狀態進行的錯誤跳轉處理。
全局異常指的是發生某些異常(如果處理的是Exception,則表示處理全部異常)之後的跳轉頁面。
eg:
1、建立一個全局異常處理,可以處理所有的Exception異常。
GlobalException.java
@ControllerAdvice // 作爲一個控制層的切面處理
public class GlobalExceptionAdvice {
public static final String DEFAULT_ERROR_VIEW = "error"; // 定義錯誤顯示頁,error.html
@ExceptionHandler(Exception.class) // 處理所有Exception類
public ModelAndView defaultErrorHandler(HttpServletRequest request,
Exception e) { // 出現異常之後會跳轉到此方法
ModelAndView mav = new ModelAndView(DEFAULT_ERROR_VIEW); // 設置跳轉路徑
//跳轉到error頁面
mav.addObject("exception", e); // 保存異常信息
mav.addObject("url", request.getRequestURL()); // 獲得請求的路徑
return mav;
}
}
2、建立個error.html頁面,進行錯誤信息顯示。
view/templates
error.html
顯示錯誤路徑 錯誤信息 進行錯誤信息顯示。
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>全局異常處理</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body>
<p th:text="${'錯誤路徑:' + url}"/>
<p th:text="${'錯誤信息:' + exception.message}"/>
</body>
</html>
3、建立一個控制器,來產生一個異常信息,觀察全局異常處理是否生效。
搞個異常來
@RestController
public class ExceptionController {
@GetMapping("/exception")
public String exception() {
//搞個異常來
int a = 10 / 0;
return "liuawen.cn" ;
}
}
執行,瀏覽器訪問一波 http://localhost/exception
訪問/exception路徑,就會產生異常,而產生異常之後將統一跳轉到error.html頁面。
<html><head>
<title>全局異常處理</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<p>錯誤路徑:http://localhost/exception</p>
<p>錯誤信息:/ by zero</p>
<div id="gtx-trans" style="position: absolute; left: 232px; top: 75.2857px;"><div class="gtx-trans-icon"></div></div></body></html>
錯誤路徑:http://localhost/exception
錯誤信息:/ by zero
4、基於Restful錯誤信息提示。 返回一波JSON格式的
可以直接採用Restful的形式迴應異常信息,不再跳轉到HTML頁面進行顯示。
直接返回JOSN格式的。
修改GlobalExceptionAdvice程序類,將其修改爲Restful風格顯示。
@RestControllerAdvice // 使用Rest風格返回
public class GlobalExceptionAdvice {
@ExceptionHandler(Exception.class) // 處理所有異常
public Object defaultErrorHandler(HttpServletRequest request,Exception e) {
class ErrorInfo { // 錯誤提示信息
private Integer code ;
private String message ;
private String url ;
// setter、getter略
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
ErrorInfo info = new ErrorInfo() ;
info.setCode(HttpStatus.INTERNAL_SERVER_ERROR.value());// 狀態碼
info.setMessage(e.getMessage()); // 保存錯誤信息
info.setUrl(request.getRequestURL().toString()); // 保存錯誤路徑
return info ;
}
}
使用了@RestControllerAdvice註解,則此時的異常處理將使用Restful風格,=
將對象轉換爲JSON格式的 顯示到頁面上。
http://localhost/exception
<html><head></head><body><link rel="stylesheet" type="text/css" href="chrome-extension://noinamigmjeiacnfhjibpfpmnckdoaog/jsonview-core.css"><style>body {
white-space: pre;
font-family: monospace;
}
.property {
font-weight: bold;
}
.type-null {
color: gray;
}
.type-boolean {
color: firebrick;
}
.type-number {
color: blue;
}
.type-string {
color: green;
}
.callback-function {
color: gray;
}
.collapser:after {
content: "-";
}
.collapsed > .collapser:after {
content: "+";
}
.ellipsis:after {
content: " … ";
}
.collapsible {
margin-left: 2em;
}
.hoverable {
padding-top: 1px;
padding-bottom: 1px;
padding-left: 2px;
padding-right: 2px;
border-radius: 2px;
}
.hovered {
background-color: rgba(235, 238, 249, 1);
}
.collapser {
padding-right: 6px;
padding-left: 6px;
}</style><div id="json"><div class="collapser"></div>{<span class="ellipsis"></span><ul class="obj collapsible"><li><div class="hoverable"><span class="property">code</span>: <span class="type-number">500</span>,</div></li><li><div class="hoverable"><span class="property">message</span>: <span class="type-string">"/ by zero"</span>,</div></li><li><div class="hoverable"><span class="property">url</span>: <span class="type-string">"</span><a href="http://localhost/exception">http://localhost/exception</a><span class="type-string">"</span></div></li></ul>}</div><div class="status"></div><div class="toolbox"><span title="expand all">+</span><span title="reduce all">-</span><a target="_blank" href="view-source:http://localhost/exception">View source</a><img title="options" src="chrome-extension://noinamigmjeiacnfhjibpfpmnckdoaog/options.png"></div></body></html>
程序發生異常之後的運行效果 頁面顯示下面的
{
code: 500,
message: "/ by zero",
url: "http://localhost/exception"
}
5、參考資料
簡單記錄
1、名師講壇:Java微服務架構實戰(SpringBoot+SpringCloud+Docker+RabbitMQ)- 李興華