Исключения

All lectures for KY purposes
Деңгээл , Сабак
жеткиликтүү

Эгерде исключение билдирүү аткарылып жаткан учурда пайда болсо же суранычты иштетүүчү тарабынан жаралса (мисалы, @Controller менен анотталган), DispatcherServlet ыйгарым укуктарды HandlerExceptionResolver тууралуу маалыматка ээ болгон биндер чынжырчасына өткөрүп берет жана адатта бул иштетүү ката тууралуу билдирүү берген альтернативдүү иштетүүнү камсыз кылат.

Төмөнкү таблицада HandlerExceptionResolver жеткиликтүү реализациялар тизмектелген:

Таблица 2. HandlerExceptionResolver Реализациялары
HandlerExceptionResolver Описание

SimpleMappingExceptionResolver

Исключение классынын аттары менен ката көрүнүштөрүнүн аттарынын ортосундагы дал келүүлөрдү камсыз кылат. Бул браузерде барактарды көрсөтүү үчүн колдонулат.

DefaultHandlerExceptionResolver

Spring MVC тарабынан жаралган исключениелерди тааныйт жана аларды HTTP статус коддоруна көрсөтөт. Ошондой эле альтернативдүү ResponseEntityExceptionHandler карагыла.

ResponseStatusExceptionResolver

@ResponseStatus менен анотталган исключениелерди тааныйт жана аларды анотациядагы мааниге негизделген HTTP статус коддоруна көрсөтөт.

ExceptionHandlerExceptionResolver

Исключениелерди @Controller же @ControllerAdvice анотациясы менен анотталган класс ичиндеги @ExceptionHandler анотациясы менен белгиленген методду чакыруу аркылуу тааныйт.

Распознавательлер чынжыры

Керек болсо, бир нече HandlerExceptionResolver биндерин Spring конфигурациясына жарыялоо жана алардын order касиеттерин ыңгайлаштыруу аркылуу исключениелердин распознаватель чынжырын түзө аласыз. Кандайдыр бир катар сапарлардын ашык болгон сайын, исключениелерди таануучу алыскы жерде жайгашат.

HandlerExceptionResolver контракты бу жактан кайтара алат:

  • Катаны көрсөтүүчү ModelAndView.

  • Исключение распознаватель ичинде иштетилген болсо, бош ModelAndView.

  • Кийинки аракеттер үчүн кайра аракет кылууну камсыз кылуу үчүн null, эгерде исключение таанылбаса, бирок акыры ал кайра сервлет контейнеринде кала берүүчү болсо.

MVC конфигурациясы Spring MVC исключениелери үчүн, @ResponseStatus анотациясы менен белгиленген исключениелер үчүн жана @ExceptionHandler анотациясы менен белгиленген методдорду колдоо үчүн демейдеги распознавательлерди автоматтык түрдө жарыялайт. Бул тизмени өзгөртсөңүз же алмаштыра аласыз.

Контейнер катасы барагы

Эгер исключение кандайдыр бир HandlerExceptionResolver тарабынан таанылбаса жана, ошого жараша, параллельдикке өтсө, же жооптун статусу ката жагдайында коюлса (б.а. 4xx, 5xx), сервлет контейнерлери демейки HTML катасы барагын көрсөтө алат. Контейнердин катасы барагын конфигурациялоо үчүн, web.xml ичинде каталар барагын чагылдыруу жарыяланса болот. Төмөнкү мисал бу документациясыз жыйынтык болгонду кандай жасоону көрсөтөт:

<error-page>
    <location>/error</location>
</error-page>

Мурунку мисалды эске алып, эгер исключение пайда болсо же жооп ката абалына ээ болсо, сервлет контейнери контейнер ичинде көрүнүштү жөнөтүүнү ERROR аталышына жүктөйт (мисалы, /error). Анын бардыгы DispatcherServlet менен иштелип чыгат, анотациясы @Controller болушу мүмкүн болгон, же болбосо моделдүү катаны көрсөтүүчү көрүнүш аталышын кайтаруу же жоопту JSON форматында чыгаруу үчүн реализацияланышы мүмкүн, төмөнкү мисалда көрсөтүлгөндөй:

Java
@RestController
public class ErrorController {
    @RequestMapping(path = "/error")
    public Map<String, Object> handle(HttpServletRequest request) {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("status", request.getAttribute("javax.servlet.error.status_code"));
        map.put("reason", request.getAttribute("javax.servlet.error.message"));
        return map;
    }
}
Kotlin
@RestController
class ErrorController {
    @RequestMapping(path = ["/error"])
    fun handle(request: HttpServletRequest): Map<String, Any> {
        val map = HashMap<String, Any>()
        map["status"] = request.getAttribute("javax.servlet.error.status_code")
        map["reason"] = request.getAttribute("javax.servlet.error.message")
        return map
    }
}
Servlet API Java'да каталар барактарынын көрүнүшүн түзүү мүмкүнчүлүгүн бербейт. Ошентсе да, WebApplicationInitializer менен бирге колдонсо болот, же жөн гана web.xml колдонсо болот.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION