在我們擁有的一些遺留代碼中,我們有一個過程來獲取我們的「基本」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/>
任何有關這方面的信息將不勝感激。
*「頁面剛停止渲染時拋出異常。」*這實際上可能有不同的原因。嘗試將響應緩衝區大小設置爲與最大頁面的HTML輸出相同的大小。例如。 50KB什麼的。順便說一下,正確的方法是將所有Java代碼放在一個servlet中而不是JSP中,並且只使用JSP來生成HTML,以便所有異常敏感的業務邏輯不會在JSP中執行。 – BalusC