We do a similar thing, intercept activateExceptionPage() in a custom
Engine. You can get the same detailed trace that Tapestry displays:
ExceptionDescription[] edArray = new
ExceptionAnalyzer().analyze(cause);
// I'm omitting some code that checks for some trivial
exceptions that we'd
// we'd rather not get emails for. For example, we filter out
those where
// a user edits the URL to give a bad page name, or the ones
from that nasty
// hacker script that's looking for insecure Windows servers.
String to = [EMAIL PROTECTED];
String from = [EMAIL PROTECTED];
StringBuffer bodyBuf = new StringBuffer("For user ");
Visit visit = (Visit) getVisit();
if (visit != null) {
userName = visit.getUserName();
}
if (userName == null) {
userName = "<none>";
}
bodyBuf.append(userName);
for (int i = 0; i < edArray.length; i++) {
// Separator line between exceptions.
bodyBuf.append("\n-----\n");
ExceptionDescription ed = edArray[i];
bodyBuf.append("Type: " + ed.getExceptionClassName());
bodyBuf.append("\nMessage: " + ed.getMessage());
String[] traces = ed.getStackTrace();
if (traces != null && traces.length > 0) {
bodyBuf.append("\nFirst line of stack trace:\n ");
bodyBuf.append(traces[0]);
// Could append the whole trace.
}
else {
bodyBuf.append("\nNo stack trace.\n");
}
}
// This is our utility method that calls javax.mail methods.
Mail.sendEmail(from, to, subject, bodyBuf.toString());
}
Olve Hansen wrote:
>tir, 17,.01.2006 kl. 21.07 +1100, skrev Lindsay Steele:
>
>
>>Is there anyway to get the exception page that tapestry displays on an
>>exception.
>>
>> At the moment I intercept the exception and display a custom page to
>>the user. At the same time I have it send me a mail
>>that the exception occurred and use my own code to get the cause and
>>some of the exception. It is not as good as I hoped though.
>>
>>I was just wondering if there was an easy way to get the detailed output
>>that Tapestry usually displays so that I can send that in an email
>>instead - giving me more information about the exception.
>>
>>
>>
>
>I just check if it is an ApplicationRuntimeException in my method (in my
>engine class) :
> protected void activateExceptionPage(IRequestCycle iRequestCycle,
>ResponseOutputStream responseOutputStream,
> Throwable throwable) throws
>ServletException {
> ExceptionRethrower exceptionRethrower = (ExceptionRethrower)
> getBean("exceptionRethrower");
> exceptionRethrower.checkForRethrow(throwable);
>
> //If we get here, no exceptions was rethrown
> if(throwable instanceof ApplicationRuntimeException){
> ApplicationRuntimeException apr =
> (ApplicationRuntimeException)
>throwable;
> log.error("Error message : "+apr.getMessage());
> log.error("Error component : "+apr.getComponent());
> log.error("Error location : "+apr.getLocation());
> }
> log.warn("\"Client-side\" exception occured:", throwable);
>
> super.activateExceptionPage(iRequestCycle, responseOutputStream,
>throwable);
> }
>
>
>Instead of logging it as done in method above, you could put the same
>information into the email.
>I guess it might even be possible to render the framework exception-page
>and put the resulting html into an email as well, that would be even
>better...
>
>HTH
>Olve
>
>