Когда мы разрабатываем весенние веб-приложения, для проверки таких исключений, как IOException и ClassNotFoundException , компилятор часто побуждает программиста использовать try-catch для явного захвата. Что касается исключений для не проверяющих, таких как ClassCastException и NullPointerException , компилятор не будет запрашивать вас, что часто является аспектом, который отражает способность программиста в написании кода.
В Spring Web, особенно приложениях Spring Boot, когда запрос будет успешно называется, он обычно возвращает объект в формате json , как показано на рисунке ниже:
Но что, если запрос бросает RuntimeException ? Если мы не сделаем обработку, будет появиться следующая страница, когда мы перезвоним снова:
То есть, когда в вызове возникает ошибка, Spring-Boot будет отображать запрос по пути /error по умолчанию. Если нет соответствующего процессора запроса пути, он вернется на вышеуказанную страницу ошибки Whitelabel .
1. Настроить страницу обработки ошибок
Конечно, невозможно не обработать исключения времени выполнения! Обычная практика состоит в том, чтобы настроить страницу единой ошибки, а затем вернуть. Согласно вышеуказанной идее, мы реализуем контроллер с пути запроса /error . Контроллер возвращает адрес пути ресурса, определяет контроллер с пути карты запросов /error и реализует интерфейс ErrorController . Код заключается в следующем:
MyErrorPageController
пакет com.example.demo.controller.handler.errorpage; import org.springframework.boot.web.servlet.error.errorcontroller; импорт org.springframework.stereotype.controller; import org.springforkwork.web.bind.nannotation.requestmapping; * * Описание: Пользовательская страница ошибки * * @author: huangjiawei * @since: 13 июня 2018 г. * @version: $ revision $ $ date $ $ $ lastchangedby $ * */ @controllerpublic class myerrorpagecontroller реализует errorcontroller {@requestmapping ("/error wurning handleerr () {return" worror hat reer "; // Этот ресурс расположен в ресурсах/статическом каталоге} @Override public String geterRorpath () {return null; }} Затем создайте файл error.html в reosurces/static каталоге:
<! Doctype html> <html> <head> <meta charset = "utf-8"> <Title> Вставьте заголовок здесь </title> </head> <body> <h1> Это страница ошибки! Хранятся в ресурсах/статическом каталоге. Вызов по умолчанию в ошибке пружины </h1> </body> </html>
Запрос http://localhost:7000/demo/getUserInfoWithNoHandler.json снова, следующим образом:
@ControllerAdvice , @ResponseBody и @ExceptionHandler , чтобы равномерно справиться с исключениями
Весной приведенные выше три аннотации могут использоваться для единой обработки исключений. По умолчанию мы можем определить унифицированный обработчик процессора для определенных типов исключений, которые появляются в системе. Например, если система бросает NullPointerException , то мы можем определить процессор специально для NullPointerException . Код заключается в следующем:
getUserInfoWithNullPointerException Интерфейс
/** * Тестирование обработки ошибок нуля указателя * @return * @Throws nullPointerException */ @requestMapping (value = "getUserInfowithnullPointerException.json", method = requestmethod.get)
NullPointerExceptionHandler.java
пакет com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controllerAdvice; import org.springframework.web.bind.annotation.exceptionHandler; импорт org.springframework.web.bindation.ressonsebydy; com.example.demo.pojo.errorreturn;/** * * Класс NullPointerExceptionHandler. * * Описание: Обработка нулевых указателей * * @author: huangjiawei * @since: 13 июня 2018 г. * @version: $ revision $ $ date $ $ $ lastchangedby $ * */ @controleradvicepublic class nullpointerexceptionhandler {@exceptionhandler (nullpointerexception.class.class. e.printstacktrace (); Errortreturn error = new errorturn (); error.setReturnCode ("-1"); error.setDesc («Исключение нулевого указателя произошло!»); вернуть ошибку; }} Исполнение браузера: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
Точно так же, если нам нужно предоставить унифицированный процессор для других исключений времени выполнения, мы также можем определить процессор для каждого типа исключения, как указано выше. Например, если мы хотим определить процессор для ArithmeticException , нам нужно только создать класс или метод, а затем добавить ArithmeticException.class в аннотацию @ExceptionHanler в методе для указания типа исключения.
Тем не менее, вы обнаружили, что таким образом определяет класс обработки исключений или метод для каждого типа исключения. Поскольку в среде выполнения есть много типов исключений, невозможно указать класс процессора или метод для каждого типа. В этом случае пружина также может решить его. Если мы не определяем процессор для определенного типа исключения, такого как ArithmeticException , то мы можем определить Exception или Throwable процессор, чтобы обработать его равномерно.
Преимущество этого заключается в том, что он уменьшает количество классов процессоров и передает обработку исключений в родительский класс, что также является основным преимуществом наследования! Однако, когда вы определяете процессор определенного типа исключения и Exception одновременно, будьте осторожны, здесь не обязательно есть приоритетные отношения, то есть, возможно, не обязательно произойдет, что выполняется только родительский процессор исключений. Он может выполнить только процессор A, не только процессор B или только процессор B, а не процессор A. Например, исключение NullPointerExceptionHandler будет передано Exception (но ArithmeticException не будет передано в Exception )
Теперь предположим, что мы определяем как NullPointerExceptionHandler выше, так и ExceptionThrowableHandler ниже. Затем, когда происходит NullPointerException , метод ExceptionThrowableHandler будет выполнен по умолчанию.
ExceptionThrowableHandler.java
пакет com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controllerAdvice; import org.springframework.web.bind.annotation.exceptionHandler; импорт org.springframework.web.bindation.ressonsebydy; com.example.demo.pojo.errortreturn;/** * * * Класс ExceptionThableHandler. * * Description: Some exceptions are passed to high-level exceptions (but ArithmeticException will not be transmitted to Exception) * * @author: huangjiawei * @since: June 13, 2018* @version: $Revision$ $Date$ $LastChangedBy$ * */@ControllerAdvicepublic class ExceptionThrowableHandler { @ExceptionHandler(Throwable.class) @ResponseBody public Errorturn dealthrowable () {errorturn error = new errorturn (); error.setDesc («Ручка бросает!»); error.setReturnCode ("-1"); вернуть ошибку; } @ExceptionHandler (exception.class) @responsebody public errorturn delecommonexception () {errorreturn error = new errortreturn (); error.setReturnCode ("-1"); error.setDesc ("Общественная обработка исключений!"); вернуть ошибку; }} Исполнение браузера: http://localhost:7000/demo/getUserInfoWithNullPointerException.json
Можно обнаружить, что процессор, который выполняет только Exception , но не выполняет нулевый указатель, то есть обработка исключений передается вверх. Давайте посмотрим на ситуацию, когда бросается ArithmeticException :
getUserInfoWithArithmeticException.json
/** * Тестирование обработки ошибок нулевого указателя * @return * @Throws nullPointerException */ @requestMapping (value = "getUserinfowitharithmecexception.json", method = requestmethod.get)
ArithmeticExceptionHandler.java
пакет com.example.demo.controller.handler; import org.springframework.web.bind.annotation.controllerAdvice; import org.springframework.web.bind.annotation.exceptionHandler; импорт org.springframework.web.bindation.ressonsebydy; com.example.demo.pojo.errorreturn; @controllerAdvicePublic Class ArithmeticexceptionHandler { / *** Руководство Arithmeticexception Exception* @return* / @Responsebody @ExceptionHandler (arithmeticexception.class) public errorturn diewarithmecexception () {rerrorturn errorobject = rerrorter rerrorter rerrortrer rerrortrer rerrortrorcrector rerrortur erirsObject.setReturnCode ("-1"); erirsObject.setDesc («Исключение произошло при арифметической обработке!»); вернуть erirsObject; }} Исполнение браузера: http://localhost:7000/demo/getUserInfoWithArithmeticException.json
В результате было обнаружено, что обработка исключений не была передана ExceptionHandler что на верхнем уровне.
Резюме: Будьте особенно осторожны при определении процессоров как конкретных типов, так и родителей, таких как Exception . Не все исключения будут обработаны на верхнем уровне. Если мы хотим только уменьшить количество классов процессоров и не хотим добавлять классы или методы для каждого конкретного типа процессора, то редактор рекомендует использовать ключевое слово для instanceof для оценки типа исключения.
Как и в следующем коде, мы создаем только общедоступный обработчик исключений, обрабатываем исключения Exception и используем instanceof для вынесения суждений.
@ExceptionHandler (exception.class) @ResponseBodyPublic errorturn Delecommonexception (Exception e) {errorturn error = new errorturn (); // Здесь вы можете использовать экземпляр для определения типа исключения if (e ancementof arithmeticexception) {error.setReturnCode ("-1"); error.setDesc («Обработка Arithmeticexception!»); вернуть ошибку; } System.err.println ("Исключение"); error.setReturnCode ("-1"); error.setDesc ("Общественная обработка исключений!"); Ошибка возврата;} Браузер выполняет интерфейс, который бросает ArithmeticException следующим образом:
Кодовый адрес этой статьи: https://github.com/smallercoder/spring_exceptionhandler
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.