【SpringBoot】 全局異常處理 (基於頁面錯誤信息顯示、基於Restful錯誤信息提示)

全局異常處理

全局異常處理指的是針對程序中產生的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)- 李興華

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章