2012-01-23 4 views
1

В каком-то унаследованном коде у нас был процесс, который захватывает наши «базовые» JSP-файлы и наклеивает верхний и нижний колонтитулы и т. Д. И все, что мы хотели на всех JSP-файлы в приложении. Одна вещь, которую этот процесс добавила ко всем JSP, - это блок try-catch вокруг всего JSP в сценариях. Так, в конце концов, все наши JSPs будет выглядеть примерно так:Каков правильный способ поймать исключение в JSTL

<% 
try 
{ 
%> 
.... all the rest of the JSP ..... 
<% 
} 
catch(Exception e) 
{ 
    Log.error(e); 
} 
%> 

Мы недавно избавилась от этого процесса и перенесли наше JSP, над использовать JSTL и не имеют каких-либо скриптлетов. Мы создали тег, который мы в основном обернуть вокруг каждого JSP сделать в заголовке, колонтитул и т.д. Так что теперь наши JSPs выглядеть примерно так:

<foo:page> 
.... all the rest of the JSP ..... 
</foo:page> 

При изготовлении этого переключателя, мы потеряли способность улавливать любые исключения, происходят при загрузке страницы. Я немного огляделся и нашел тег <c:catch>. Я попытался поместить это в наш тег, но я не могу заставить его работать так, как мы хотим. Я обнаружил, что если я поместил тег <c:catch> только в тег <jsp:doBody/> в тег страницы, он поймал бы исключение, и я мог бы что-то с ним сделать. Тем не менее, это не поймает никаких исключений, которые вызывают в других частях этого тега внешней страницы. В идеале я бы включил весь тег всей страницы тегом <c:catch>, но когда я это делаю, похоже, что это исключение. Страница просто прекращает рендеринг в точке, где было выбрано исключение.

У меня есть один и тот же

<c:if test="${!(empty pageException)}"> 
    ERROR! 
</c:if> 

после <c:catch> тега в обоих случаях, но только на самом деле увидеть «ERROR!» в источнике, когда тег <c:catch> находится непосредственно вокруг <jsp:doBody/>

Любая информация об этом была бы принята с благодарностью.

+0

* «Страница просто прекращает рендеринг в точке, в которую было выбрано исключение». * Это может иметь иную причину. Попробуйте установить размер буфера ответа на тот же размер, что и вывод HTML на вашей самой большой странице. Например. 50 КБ или что-то в этом роде. Кстати, правильным способом было бы поместить весь этот Java-код в сервлет вместо JSP и использовать JSP для генерации HTML только для того, чтобы вся исключительная бизнес-логика не выполнялась в JSP. – BalusC

ответ

2

Вы можете использовать атрибут errorPage в директиве <%@ page %> вместо того, чтобы разрывать блок catch try или <c:catch></c:catch>.

1.Создание страницы JSP с одной ошибкой, которая обрабатывает ошибки, возникающие на всех других страницах JSP в приложении. Чтобы указать страницу JSP в качестве страницы ErrorHandler, используйте эту страницу директиву JSP:

<%@ page isErrorPage="true" %>` 

На странице ErrorHandler JSP, используйте exception неявный объект для получения сведений об исключении.

2.Include страница ErrorHandler JSP в других страниц JSP, используя эту директиву JSP, чтобы указать, что, если есть исключения, происходящие на текущей странице, направить запрос на errorHandler.jsp:

<%@ page errorPage="/errorHandler.jsp" %>

1

<c:catch> должен работать. В качестве резервной копии вы можете использовать свой класс <foo:page>TryCatchFinally и обрабатывать там исключение.

Смежные вопросы