When the container translates your JSP into a
servlet, it will declare the "exception" variable only if the isErrorPage attribute is set to true. That's why you can't access the variable if the attribute is not set to true, because it doesn't even exist in the servlet !
However, the pageContext implicit attribute is always accessible from EL, that's why you can always call ${pageContext.exception}.