patrickl    2002/08/15 16:51:14

  Modified:    catalina/src/share/org/apache/catalina/valves
                        ErrorDispatcherValve.java
  Log:
  If a Servlet generates a RuntimeException, it is wrapped by a ServletException. 
Since there is an entry for ServletException in the web.xml, the actual root cause (in 
this case, an IllegalStateException) was never unwrapped, thus leading to unexpected 
behavior.
  
  I made a simple modification to the logic so that if the throwable passed to the 
ErrorDispatcherValve is a ServletException, it will attempt to get the root cause.  If 
the root cause is null, then proceed with the error page lookup with the 
ServletException as the throwable object, otherwise, use the root cause for the error 
page lookup.
    Submitted by:       Ryan Lubke ([EMAIL PROTECTED])
  
  Revision  Changes    Path
  1.9       +14 -14    
jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/valves/ErrorDispatcherValve.java
  
  Index: ErrorDispatcherValve.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/valves/ErrorDispatcherValve.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- ErrorDispatcherValve.java 2 Dec 2001 22:19:26 -0000       1.8
  +++ ErrorDispatcherValve.java 15 Aug 2002 23:51:14 -0000      1.9
  @@ -212,20 +212,20 @@
        */
       protected void throwable(Request request, Response response,
                                Throwable throwable) {
  -
           Context context = request.getContext();
           if (context == null)
               return;
  -
  +        
           Throwable realError = throwable;
  -        ErrorPage errorPage = findErrorPage(context, realError);
  -        if ((errorPage == null) && (realError instanceof ServletException)) {
  +        
  +        if (realError instanceof ServletException) {
               realError = ((ServletException) realError).getRootCause();
  -            if (realError != null)
  -                errorPage = findErrorPage(context, realError);
  -            else
  +            if (realError == null) {
                   realError = throwable;
  -        }
  +            }
  +        } 
  +            
  +        ErrorPage errorPage = findErrorPage(context, realError);
   
           if (errorPage != null) {
               response.setAppCommitted(false);
  @@ -237,7 +237,7 @@
               sreq.setAttribute(Globals.ERROR_MESSAGE_ATTR,
                                 throwable.getMessage());
               sreq.setAttribute(Globals.EXCEPTION_ATTR,
  -                              throwable);
  +                              realError);
               Wrapper wrapper = request.getWrapper();
               if (wrapper != null)
                   sreq.setAttribute(Globals.SERVLET_NAME_ATTR,
  @@ -246,7 +246,7 @@
                   sreq.setAttribute(Globals.EXCEPTION_PAGE_ATTR,
                                     ((HttpServletRequest) sreq).getRequestURI());
               sreq.setAttribute(Globals.EXCEPTION_TYPE_ATTR,
  -                              throwable.getClass());
  +                              realError.getClass());
               if (custom(request, response, errorPage)) {
                   try {
                       sresp.flushBuffer();
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to