2012-01-23 74 views
1

在我們擁有的一些遺留代碼中,我們有一個過程來獲取我們的「基本」JSP文件,並粘貼頁眉,頁腳等等,以及所有我們想要的東西整個應用程序中的JSP文件。這個過程添加到所有JSP的一件事是圍繞整個JSP腳本中的try-catch塊。因此,在年底,我們所有JSP會是這個樣子:什麼是在JSTL中捕獲異常的正確方法

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

最近,我們擺脫了這一過程,並在動了我們的JSP使用JSTL,而不是有任何的scriptlet。我們創建了一個標籤,我們基本上圍繞每一個JSP包裹做頁眉,頁腳,等等。所以,現在我們的JSP是這個樣子:

<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>標籤後

,但我只真正看到「錯誤!」在源代碼中<c:catch>標籤立即圍繞着<jsp:doBody/>

任何有關這方面的信息將不勝感激。

+0

*「頁面剛停止渲染時拋出異常。」*這實際上可能有不同的原因。嘗試將響應緩衝區大小設置爲與最大頁面的HTML輸出相同的大小。例如。 50KB什麼的。順便說一下,正確的方法是將所有Java代碼放在一個servlet中而不是JSP中,並且只使用JSP來生成HTML,以便所有異常敏感的業務邏輯不會在JSP中執行。 – BalusC

回答

2

您可以在<%@ page %>指令中使用errorPage屬性,而不是包含try catch塊或<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並處理那裏的異常。

相關問題