在一个系统开发中,总会出现异常,如果这个异常可以处理就会在处理逻辑加上对异常的处理,如果无法处理就可能需要跳转到我们写好的一个友善的错误页面。不管这样都是要进行响应的。
下面介绍在开发中出现异常的几种处理方式:
将异常映射为http状态码
spring中的一些异常会默认映射http状态码
在出现上面的异常时,spring会根据默认的映射规则响应。但如果出现的是我们自定义的异常,那spring是不知道该如果映射的,这时我们可以通过@ResponseStatus注解给我们自定义的异常添加映射规则。
@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="SPittle Not Found")
public class SpittleNotFoundException extends RuntimeException{
}
在上面的例子中,SpittleNotFoundExcaption是我们自定义的异常,通过注解@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="SPittle Not Found"),我们就将这个注解映射为404状态了,当在controller中出现这个异常,我们没有进行处理,就会对用户返回一个404的响应。
编写异常处理方法
1,在处理请求的方法中直接处理异常
@RequestMapping("/login")
public String saveSpittle(SpittleForm form, Model model){
try {
spittleRepository.save(form);
}catch (DuplicateSpittleException e){
return "error/duplicate";
}
}
2,在上面的处理方法如果只是处理一次这个异常当然没问题,但是如果controller中多处都出现这个异常,那每次都编写一次处理逻辑就会很麻烦,所以spring提供了@ExceptionHandler这个注解,通过这个注解可以编写一次异常处理应用到同一个controller的所有同样的异常处理中。
@ExceptionHandler(DuplicateSpittleException.class)
public String handleDuplicateSpittle(){
return "error/duplicate";
}
只要在controller中添加上面这个方法,就可以对controller中所有的DuplicateSpittleException异常进行处理。
3,在上面的方法中可以对某个contrller的某个异常进行处理,但是在开发中还会出现这样的情况,不同的controller中也可能出现一样的异常,所有spring还提供给控制器添加通知的注解@ControllerAdvice。
@ControllerAdvice
public class AppWideExceptionHandler{
@ExceptionHandler(DuplicateSpittleException.class)
public String duplicateSpittleHandler(){
return "error/duplicate";
}
}
在编写上面的类后,所有的controller出现的所有DuplicateSpittleException异常都会通过duplicateSpittleHandler方法进行响应。