Как уберечься от этого исключения?Определенно попробуйте, поймайте здесь, но не уверены, где его поставить.
Поймать исключение только там, где вы можете разумно его обработать.
Я пытаюсь поймать com.mysql.jdbc.exceptions.jdbc4.CommunicationsException, но я получил сообщение об ошибке: Exception com.mysql.jdbc.exceptions.jdbc4.CommunicationsException никогда не добавляется в тело соответствующего оператора try.
В этом случае CommunicationsException
является вложенный исключение DatabaseException
.EclipseLink находится под прикрытием, уже улавливая CommunicationsException
и перебрасывая его как DatabaseException
с CommunicationsException
в качестве основной причины.Что-то вроде:
try {
// Execute query.
} catch (Exception e) {
throw new DatabaseException("Internal Exception: " + e, e);
}
Теоретически, вы можете справиться с этим только следующим образом:
try {
// Let EclipseLink execute query.
} catch (DatabaseException e) {
if (e.getCause() instanceof CommunicationsException) {
// Handle.
}
}
Что, однако, уродливо и не рекомендуется в данном конкретном случае
Ниже приведены мои коды, где бы я мог поймать исключение?
Зависит от того, как вы обработаете исключение.Если вы хотите отобразить его на странице ошибок generic , то вам не следует ловить его самостоятельно, а просто отпустить.Контейнер-сервлет сам поймает и обработает его.Он найдет лучшее соответствие <error-page>
в web.xml
и отобразит его.
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/generic-error.xhtml</location>
</error-page>
На этом экране будет отображаться /generic-error.xhtml
для всех подклассов java.lang.Exception
.
Если вы хотите отобразить его в определенном страница ошибки, тогда вам нужно объявить <exception-type>
более конкретным, чтобы соответствовать фактическому типу исключения.Например:
<error-page>
<exception-type>org.eclipse.persistence.exceptions.DatabaseException</exception-type>
<location>/database-error.xhtml</location>
</error-page>
Однако, хотя это не указано явно в вашем вопросе, я знаю по истории ваших вопросов, что вы используете JSF с PrimeFaces .Вы должны иметь в виду, что PrimeFaces будет , а не отображать страницу с ошибкой, когда первоначальный запрос был сделан ajax.Вместо этого его обработчик представления ajax уже перехватил само исключение, и он делегирует компоненту <p:ajaxStatus>
в представлении.Попробуйте добавить ajax="false"
в командный компонент PrimeFaces, и вы, наконец, увидите страницу ошибок по умолчанию для сервлетконтейнера (или любую вашу, если найдена соответствующая страница в web.xml
).
Если вы хотите отобразить некоторый универсальный пользовательский интерфейс JSF, когда PrimeFaces получил ошибку ajax, то используйте error
фасет <p:ajaxStatus>
.Например,
<p:ajaxStatus>
<f:facet name="start"><h:graphicImage value="images/ajax-loader.gif" /></f:facet>
<f:facet name="success"><h:outputText value="" /></f:facet>
<f:facet name="error">
<h:panelGroup layout="block" styleClass="ui-message-error ui-widget ui-corner-all">
<h:outputText value="An error has occurred!" /><br />
<h:outputLink value="#" onclick="window.location.reload(true)"><h:outputText value="Please reload page and retry" /></h:outputLink><br />
<h:outputLink value="mailto:support@example.com?subject=Ajax%20Error"><h:outputText value="If in vain, please contact support" /></h:outputLink>
</h:panelGroup>
</f:facet>
</p:ajaxStatus>
(однако в PrimeFaces 2.2 RC1 есть ошибка , которая приводит к сбою при отображении фасета ошибки, он корректно работает в PrimeFaces 2.1)