Ok...here's the explanation...not satisfactory...but at least you know what's happening
Irrespective of whether you use the page directive <%@ page errorPage="errorPage.jsp" %> in test.jsp or not, important thing is that you have included the page directive <%@ page isErrorPage="true" %> in errorPage.jsp which is a
requirement in order to get the
JSP Implicit object
exception...
Now, when you use the page directive <%@ page errorPage="errorPage.jsp" %> in test.jsp, the container returns the Exception associated with the errorPage.jsp since ${pageContext.exception} is actually pageContext.getException() called from errorPage.jsp...but when you don't use the directive in test.jsp, the container does not associate the exception with errorPage.jsp....I dunno why exactly this happens but I did fing the difference in method arguments(in the former case "errorPage.jsp" is passed but in the latter case it's null) passed when the container gets the pageContext implicit object....you can see it for yourself by checking the generated
servlet code for test.jsp in both cases...Somethin's happenin'....not exactly sure because these methods are way too complex...BUT yeah I guess the reason why you're getting the JSP implicit object "exception" is exactly as explained above and it's mentioned in HFSJ as well(hand-written note Page 461)
Hope that helps to some extent

[ December 08, 2006: Message edited by: Sayak Banerjee ]