Эта статья была впервые опубликована в блоге технологий Java[код]:jdkcb.com/
Предисловие:
В реальной разработке приложений некоторые программные ошибки часто вызваны некоторыми неконтролируемыми факторами.В это время информация об исключении должна быть возвращена клиенту вовремя, чтобы клиент мог своевременно с ней справиться, а для исключения вызванный кодом, у нас обычно есть два метода обработки, один - бросать напрямую бросками, другой - использовать try..catch для захвата, в общем, если логика ненормальна, нам нужно знать информацию об исключении, мы часто выбирают генерацию исключения, хотя бы для того, чтобы гарантировать, что программа может продолжать работать в случае ошибки, используйте try..catch для захвата.
Но try..catch приведет к увеличению объема кода, что сделает наш код раздутым и сложным для дальнейшего обслуживания. Конечно, как такой отличный фреймворк, Springboot точно не будет сидеть сложа руки.Благодаря аннотациям, которые идут вместе со Springboot, мы можем легко настроить наш глобальный обработчик исключений и вернуть его нашему клиенту в формате json.
Код боя:
Перехватить глобальное исключение:
Прежде всего, давайте возьмем на себя ответственность за новый класс catch для глобальной обработки исключений: MyControllerAdvice, код которого выглядит следующим образом:
@ControllerAdvice
public class MyControllerAdvice {
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map<String,Object> exceptionHandler(Exception ex){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",100);
map.put("msg",ex.getMessage());
//这里可以加上我们其他的异常处理代码,比如日志记录,,,
return map;
}
}
Примечания:
@ControllerAdvice фиксирует исключения, возникающие на уровне контроллера, через АОП с аннотацией @ExceptionHandler(). Если вам нужно сканировать контроллер по пользовательскому пути, добавьте свойство basePackages
@ControllerAdvice(basePackages ="com.example.demo.controller")
@RestControllerAdvice : то же, что и @ControllerAdvice, его можно понимать как комбинацию @ResponseBody+@ControllerAdvice.
@ExceptionHandler(): Основная функция этой аннотации состоит в том, чтобы объявить один или несколько типов исключений.Когда квалифицированный контроллер выдает эти исключения, эти исключения будут перехвачены, а затем обработаны в соответствии с логикой отмеченных ими методов, тем самым изменение Возвращаемая информация о представлении.
контрольная работа:
@RestController
public class UserController {
@GetMapping("/test")
public String test(){
int num = 1/0;
return "Hello World";
}
}
результат:
{"msg":"/ by zero","code":100}
Поймать пользовательское исключение:
Настройте наш класс информации об исключении MyException и наследуйте RuntimeException:
public class MyException extends RuntimeException {
private String errorCode;
private String errorMsg;
public MyException(String errorCode, String errorMsg) {
this.errorCode = errorCode;
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
}
Измените наш MyControllerAdvice, чтобы добавить MyException:
@ResponseBody
@ExceptionHandler(value = MyException.class)
public Map<String,Object> myExceptionHandler(MyException mex){
Map<String,Object> map = new HashMap<String,Object>();
map.put("code",mex.getErrorCode());
map.put("msg",mex.getErrorMsg());
//其他业务代码...
return map;
}
контрольная работа:
@GetMapping("/test1")
public String test1(){
String name = null;
if(name == null){
throw new MyException("101","用户名为空");
}
return "Hello World";
}
вывод:
{"msg":"用户名为空","code":"101"}
Готово~, следуй за мной, ешь привет фрукты, хм.