Allow the application to customize the conversion of arbitrary error messages

to friendly error text.


git-svn-id: https://samskivert.googlecode.com/svn/trunk@1758 6335cc39-0255-0410-8fd6-9bcaacd3b74c
This commit is contained in:
mdb
2006-01-16 22:50:22 +00:00
parent 2d47fd2690
commit ef5636a175
2 changed files with 29 additions and 17 deletions
@@ -24,6 +24,7 @@ import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.velocity.app.Velocity;
@@ -34,6 +35,7 @@ import com.samskivert.servlet.MessageManager;
import com.samskivert.servlet.RedirectException;
import com.samskivert.servlet.SiteIdentifier;
import com.samskivert.servlet.SiteResourceLoader;
import com.samskivert.servlet.util.ExceptionMap;
import com.samskivert.util.StringUtil;
/**
@@ -43,6 +45,16 @@ import com.samskivert.util.StringUtil;
* represents the web application. The application class is responsible
* for initializing services that will be used by the application's logic
* objects as well as cleaning them up when the application is shut down.
*
* <p><b>Error handling</b><br>
* The application provides a common error handling mechanism. The design is to
* catch any exceptions thrown by the logic and to convert them into friendly
* error messages that are inserted into the invocation context with the key
* <code>"error"</code> for easy display in the resulting web page.
*
* <p> The default process of mapping exceptions to friendly error messages is
* done using the {@link ExceptionMap} class. This can be replaced by
* overriding {@link #handleException}.
*/
public class Application
{
@@ -198,6 +210,22 @@ public class Application
return error;
}
/**
* If a generic exception propagates up from {@link Logic#invoke} and is
* not otherwise converted into a friendly or redirect exception, the
* application will be required to provide a generic error message to be
* inserted into the context and should take this opportunity to log the
* exception.
*/
protected String handleException (
HttpServletRequest req, Logic logic, Exception error)
{
Log.warning("Choked on request [logic=" + logic +
", req=" + req.getRequestURI() + "].");
Log.logStackTrace(error);
return ExceptionMap.getMessage(error);
}
/**
* This should be overridden by the application implementation to
* perform any necessary cleanup.
@@ -46,7 +46,6 @@ import com.samskivert.servlet.MessageManager;
import com.samskivert.servlet.RedirectException;
import com.samskivert.servlet.SiteIdentifier;
import com.samskivert.servlet.SiteResourceLoader;
import com.samskivert.servlet.util.ExceptionMap;
import com.samskivert.servlet.util.FriendlyException;
import com.samskivert.util.ConfigUtil;
@@ -136,19 +135,7 @@ import com.samskivert.util.StringUtil;
* inserted in the future (ie. if I ever want to use this to develop a
* cobranded web site).
*
* <p><b>Error handling</b><br>
* The dispatcher servlet provides a common error handling mechanism. The
* design is to catch any exceptions thrown by the logic and to convert
* them into friendly error messages that are inserted into the invocation
* context with the key <code>"error"</code> for easy display in the
* resulting web page.
*
* <p> The process of mapping exceptions to friendly error messages is
* done using the {@link ExceptionMap} class. Consult its documentation
* for an explanation of how it works.
*
* @see Logic
* @see ExceptionMap
*/
public class DispatcherServlet extends VelocityServlet
implements MethodExceptionEventHandler
@@ -382,10 +369,7 @@ public class DispatcherServlet extends VelocityServlet
errmsg = fe.getMessage();
} catch (Exception e) {
errmsg = ExceptionMap.getMessage(e);
Log.warning("Choked on request [logic=" + logic +
", req=" + req.getRequestURI() + "].");
Log.logStackTrace(e);
errmsg = _app.handleException(req, logic, e);
}
// if we have an error message, insert it into the template