[ 
http://issues.apache.org/jira/browse/JELLY-235?page=comments#action_12426279 ] 
            
Jesse Glick commented on JELLY-235:
-----------------------------------

On a related note: the logic for extracting a detail message from the cause is 
not very helpful. Example: in my servlet error page I see

---%<---
exception

javax.servlet.ServletException: file:/[....].jelly:6:66: <j:forEach> 
org/apache/commons/collections/iterators/ArrayIterator
[....]

root cause

org.apache.commons.jelly.JellyTagException: file:/[....].jelly:6:66: 
<j:forEach> org/apache/commons/collections/iterators/ArrayIterator
        
org.apache.commons.jelly.impl.TagScript.handleException(TagScript.java:712)
        org.apache.commons.jelly.impl.TagScript.run(TagScript.java:282)
[.....]

note The full stack trace of the root cause is available in the Apache 
Tomcat/5.5.17 logs.
---%<---

Hmm. Not very informative. What is wrong with ArrayIterator? Not of the right 
type? Hard to guess. Need to go look at the server logs, where I see

---%<---
Caused by: java.lang.NoClassDefFoundError: 
org/apache/commons/collections/iterators/ArrayIterator
        at 
org.apache.commons.jelly.expression.ExpressionSupport.evaluateAsIterator(ExpressionSupport.java:106)
        at 
org.apache.commons.jelly.tags.core.ForEachTag.doTag(ForEachTag.java:89)
        at org.apache.commons.jelly.impl.TagScript.run(TagScript.java:262)
---%<---

Now that immediately tells me what is going on. The crucial info is the 
exception class name: NoClassDefFoundError.

The problem in Jelly is here:

---%<---
public JellyException(Throwable cause, String fileName, String elementName, int 
columnNumber, int lineNumber) {
    this(cause.getLocalizedMessage(), cause, fileName, elementName, 
columnNumber, lineNumber);
}
public JellyException(String reason, Throwable cause, String fileName, String 
elementName, int columnNumber, int lineNumber) {
    super( (reason==null?cause.getClass().getName():reason) );
    // ....
---%<---

A NCDFE has as its message (and, by default, also its localizedMessage) the 
class name that could not be found. Since reason != null, that is used as the 
detail message also for the JellyException. But this is not as informative as 
it should be.

I would therefore recommend changing the code to e.g.

---%<---
public JellyException(Throwable cause, String fileName, String elementName, int 
columnNumber, int lineNumber) {
    this(cause.toString(), cause, fileName, elementName, columnNumber, 
lineNumber);
}
public JellyException(String reason, Throwable cause, String fileName, String 
elementName, int columnNumber, int lineNumber) {
    super( (reason==null?cause.toString():reason) );
    // ....
---%<---

This would ensure that by default, the exception detail message shown in the 
web page includes *both* the detail message and class name of the original 
exception.

> nested exceptions are displayed incorrectly with JellyException
> ---------------------------------------------------------------
>
>                 Key: JELLY-235
>                 URL: http://issues.apache.org/jira/browse/JELLY-235
>             Project: Commons Jelly
>          Issue Type: Improvement
>          Components: core / taglib.core
>    Affects Versions: 1.0
>            Reporter: Kohsuke Kawaguchi
>         Attachments: JELLY.diff
>
>
> JellyException has some built-in support for nested exceptions. In 
> particular, when it displays a stack trace, it tries to also displays the 
> nested exception, which is great.
> What's not so great is that when JDK 1.4 added this on its own, both Jelly 
> and JDK try to display the nested exceptions, and you ended up seeing O(n^2) 
> stack traces for n-level nested exception.
> Imagine a situation where N JellyExceptions are nested inside each other.
> With the following current printStackTrace:
> {code}
>     public void printStackTrace() {
>         super.printStackTrace();
>         if (cause != null) {
>             System.out.println("Root cause");
>             cause.printStackTrace();
>         }
>     }
> {code}
> Outer JellyException prints its stack trace first (in which JDK prints out 
> all the nested exceptions),
> and then JellyException prints the stack trace of the inner JellyException. 
> Then this same step is repeatedly, causing an output like this:
> {noformat}
> JellyExpception 3
> Caused by JellyException 2
> Caused by JellyException 1
> Root cause:
> JellyException 2
> Caused by JellyException 1
> Root cause:
> JellyException 1
> {noformat}
> See the attached patch for one possible fix.
> Personally, I don't mind if JellyException choose to completely stop trying 
> to print out the nested exception on its own, and simply delegate everything 
> to JDK. This will make the output worse on JDK 1.3 and earlier, but the # of 
> people using those is shrinking every day.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

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

Reply via email to