07-SpringBoot之WEB(五)——異常處理
阿新 • • 發佈:2018-11-17
SpringBoot之WEB(五)
- 1. 異常頁面
- 2. 全域性異常捕獲
- 3. 自定義異常
- 3.1 建立一個自定義異常類
- 3.2 在GlobalDefaultExceptionHandler.java檔案中新增MyException處理
- 3.3 新建MyException異常處理返回頁面,在目錄resources\templates下建立myException.ftl
- 3.4 模擬MyException異常丟擲
- 3.5 執行結果
- 4. 原始碼下載
1. 異常頁面
編寫模擬異常丟擲程式碼如下:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by HuangJun
* 14:06 2018/11/9
*/
@RestController
public class ExceptionController {
@RequestMapping("/exception")
public Object exception() throws Exception{
/***
* 模擬異常丟擲
*/
throw new Exception("My Exception");
}
}
瀏覽器訪問http://localhost:8080/test/exception,執行結果如下圖
該頁面的內容對使用者來說不友好,我們可以自定義一個友好的提示系統異常的頁面。
在 src/main/resources 下建立 /public/error,在該目錄下再建立一個名為 5xx.html 檔案,該頁面的內容就是當系統報錯時返回給使用者瀏覽的內容:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>系統錯誤</title>
</head>
<body>
<div>
<h2>系統內部錯誤</h2>
</div>
</body>
</html>
500異常返回頁面效果
再自定義一個404返回頁面,在 /public/error 目錄下再建立一個名為 404.html 的檔案:
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>訪問異常</title>
</head>
<body>
<div>
<h2>找不到頁面</h2>
</div>
</body>
</html>
404異常返回頁面效果:
2. 全域性異常捕獲
假設專案前後端是通過 JSON 進行資料通訊,編寫一個充當全域性異常的處理類GlobalDefaultExceptionHandler,需要使用 @ControllerAdvice 和 @ExceptionHandler 註解:
import com.springboot.web.exception.MyException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
/**
* Created by HuangJun
* 14:34 2018/11/9
*/
@ControllerAdvice
public class GlobalDefaultExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Map<String,Object> defaultExceptionHandler(Exception e) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("code", 500);
map.put("msg", e.getMessage());
return map;
}
}
其中,方法名為任意名,入參一般使用 Exception 異常類,方法返回值可自定義。
3. 自定義異常
3.1 建立一個自定義異常類
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Created by HuangJun
* 14:39 2018/11/9
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class MyException extends RuntimeException{
private String code; //異常狀態碼
private String message; //異常資訊
private String method; //發生的方法,位置等
private String descinfo; //描述
}
3.2 在GlobalDefaultExceptionHandler.java檔案中新增MyException處理
/***
* 自定義異常
* @param myex
* @return
*/
@ExceptionHandler(value = MyException.class)
public Object myExceptionHandler(MyException myex){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",myex.getCode());
map.put("message",myex.getMessage());
map.put("method",myex.getMethod());
map.put("descinfo",myex.getDescinfo());
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("myException");
modelAndView.addObject("ex", map);
return modelAndView;
}
3.3 新建MyException異常處理返回頁面,在目錄resources\templates下建立myException.ftl
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<title>我的異常頁</title>
</head>
<body>
<div class="container">
<h2>我的異常頁</h2>
<ul>
<li>code: ${ex.code}</li>
<li>message: ${ex.message}</li>
<li>method: ${ex.method}</li>
<li>descinfo: ${ex.descinfo}</li>
</ul>
</table>
</div>
</body>
</html>
3.4 模擬MyException異常丟擲
@RequestMapping(value = "/myException")
public String myException(HttpServletRequest request ) throws Exception{
String name = "";
if(StringUtils.isEmpty(name)){
System.out.println(request.getRequestURL());
throw new MyException("1001","empty",request.getRequestURL().toString(),"在獲取使用者名稱字的時候為空");
}
return name;
}
3.5 執行結果
瀏覽器訪問http://localhost:8080/test/myException,執行結果如下:
4. 原始碼下載
原始碼下載地址:https://download.csdn.net/download/huangjun0210/10775125