Выдача пользовательского исключения в сервлете

Я хочу выдавать пользовательский exception, похожий на следующий, из сервлета всякий раз, когда возникает какая-то конкретная проблема.

public class CustomException extends Throwable {

    private String[] errArray;

    public CustomException(String[] errArray){
        this.errArray = errArray;
    }

    public String[] getErrors(){
        return errArray;
    }

}

И затем, когда возникает это исключение, я хочу перенаправить пользователя на определенную страницу с ошибкой.

<error-page>
    <exception-type>com.example.CustomException</exception-type>
    <location>/WEB-INF/jsp/errorPage.jsp</location>
</error-page>

Вот страница с ошибкой, я хочу использовать неявный объект исключения.

<%@ page isErrorPage="true" %>
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>

<my:head title="Error"></my:head>
<body>
    <% String errArray = exception.getErrors(); %>
</body>
</html>

Теперь проблема возникает, когда я добавляю CustomException в объявление throws метода doGet сервлета. Я получаю следующую ошибку:

Exception CustomException is not compatible with throws clause in HttpServlet.doGet(HttpServletRequest, HttpServletResponse)

Как я могу решить эту проблему? Возможно ли вообще такое настраиваемое исключение и переходить на страницу с ошибкой, когда оно выбрасывается? Или есть другой способ? Заранее спасибо :)


person sha256    schedule 08.11.2012    source источник


Ответы (1)


HttpServlet класс doGet бросает ServletException, как указано ниже:

    protected void doGet(HttpServletRequest req,
                 HttpServletResponse resp)
          throws ServletException,
                 java.io.IOException

Пожалуйста, сделайте свой CustomException для расширения ServletException в соответствии со спецификацией метода.

РЕДАКТИРОВАТЬ: в вашем error.jsp получите ошибки как:

<% String[] errArray = null; 
  if(exception instanceof CustomException) {
     errArray = (CustomException)exception.getErrors();
  } 
%>

Обратите внимание: он возвращает String[]

person Yogendra Singh    schedule 08.11.2012
comment
Вопрос, не могли бы вы вместо этого расширить RuntimeException, поскольку их не нужно перехватывать или декларировать в подписи? - person Jacob Schoen; 08.11.2012
comment
@jschoen: Конечно, можете, но я предпочитаю избегать их в таких сценариях, где ожидается некоторое поведение публикации на основе исключения, аналогичного самому doGet, которое намеренно выбрасывает ServletExcetion. - person Yogendra Singh; 08.11.2012
comment
только что проверил. Он не перенаправляет на страницу с ошибкой. Я что-то упускаю? - person sha256; 08.11.2012
comment
ну, я думаю, что это действительно перенаправляет, но теперь обнаруживается эта проблема: An error occurred at line: 14 in the jsp file: /WEB-INF/jsp/errorPage.jsp The method getErrors() is undefined for the type Throwable - person sha256; 08.11.2012
comment
@ sha404: напечатайте exception.getClass (). getName (), чтобы проверить, какое исключение вы получили? Я думаю, вам нужно сделать там приведение типов как: ‹% String errArray = (CustomException)exception.getErrors(); %> - person Yogendra Singh; 08.11.2012
comment
@YogendraSingh Я давно ничего не делал с jsp, но не могли бы вы просто instance of проверить свой тип исключения, и если он совпадает, примените его, чтобы получить то, что вы хотите? - person Jacob Schoen; 08.11.2012
comment
@jschoen Обновление ответа следующим образом: ‹% String [] errArray = null; if (instanceof CustomException) {errArray = (CustomException) exception.getErrors ();}% › - person Yogendra Singh; 08.11.2012