You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2003/10/18 17:51:59 UTC
DO NOT REPLY [Bug 717] -
quiet swallowing of exceptions
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=717>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=717
quiet swallowing of exceptions
minchau@ca.ibm.com changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |WORKSFORME
------- Additional Comments From minchau@ca.ibm.com 2003-10-18 15:51 -------
I ran the testcase posted by Scott Lamb twice. The first time with
RUNTIME=true so that it throws a RuntimeException. Stopping with a debugger
just at the throw point the stack looks like this:
----------------------------------------------------------
XalanExceptionBugTester$1.startElement(String, String, String, Attributes)
line: 59
TransformerIdentityImpl.startElement(String, String, String, Attributes) line:
1042
SAXParser(AbstractSAXParser).startElement(QName, XMLAttributes, Augmentations)
line: not available [local variables unavailable]
SAXParser(AbstractXMLDocumentParser).emptyElement(QName, XMLAttributes,
Augmentations) line: not available [local variables unavailable]
XMLDTDValidator.emptyElement(QName, XMLAttributes, Augmentations) line: not
available [local variables unavailable]
XMLDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanStartElement() line:
not available [local variables unavailable]
XMLDocumentScannerImpl$ContentDispatcher.scanRootElementHook() line: not
available [local variables unavailable]
XMLDocumentScannerImpl$ContentDispatcher
(XMLDocumentFragmentScannerImpl$FragmentContentDispatcher).dispatch(boolean)
line: not available [local variables unavailable]
XMLDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanDocument(boolean)
line: not available [local variables unavailable]
XML11Configuration.parse(boolean) line: not available [local variables
unavailable]
XML11Configuration(DTDConfiguration).parse(XMLInputSource) line: not available
[local variables unavailable]
SAXParser(XMLParser).parse(XMLInputSource) line: not available [local variables
unavailable]
SAXParser(AbstractSAXParser).parse(InputSource) line: not available [local
variables unavailable]
XalanExceptionBugTester.main(String[]) line: 125
--------------------------------------------
All of the stack frames were from Xerces except for the oldest and newest ones
which were int XalanExceptionBugTester and the second newest stackframe which
was one in TransformerImpl in Xalan. Specifically this line was:
org.apache.xalan.transformer.TransformerIdentityImpl.startElement
(String,String,String,Attributes) and was the last line in that method.
public void startElement(
String uri,
String localName,
String qName,
Attributes attributes) {
// ... there is code here ...
// The throw occurs on the next line, the last on in this method . . .
m_resultContentHandler.startElement(uri, localName, qName, attributes);
}
Given that the user code called from this line throws either a RuntimeException
or a SAXException and this exception says it "throws SAXException" there is not
much that Xalan does with it, it just percolates to pervious stack frames in
Xerces and then the users code. Indeed I set a breakpoint in the
TransformerImple.postExceptionFromThread() method suggested by the originator
of the defect, Patrick Moore but the code is commented out because of a bug
reported by Nicola Brown. Barring comments the only thing left in the method is:
m_isTransformDone = true;
m_exceptionThrown = e;
synchronized (this)
{
notifyAll();
}
Setting a breakpoint on "notifyAll();" did not stop, so as the stackframe that
I included would indicate, this method is no longer involved. Indeed when the
program ran to conclusion the RuntimeException did not get quietly swallowed
but was caught by the code inprinted by the user code in
XalanExceptionBugTester.main(String[]) :
} catch (Exception e) {
e.printStackTrace();
}
It came out as:
-----------------------------------
java.lang.RuntimeException: RuntimeException for XalanExceptionBugTester
at XalanExceptionBugTester$1.startElement
(XalanExceptionBugTester.java:61)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement
(TransformerIdentityImpl.java:1043)
at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown
Source)
at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement
(Unknown Source)
at XalanExceptionBugTester.main(XalanExceptionBugTester.java:125)
-------------------------------------
Changing the value
--------------------------------------
org.xml.sax.SAXParseException: SAXParserException for XalanExceptionBugTester
at XalanExceptionBugTester$1.startElement
(XalanExceptionBugTester.java:63)
at org.apache.xalan.transformer.TransformerIdentityImpl.startElement
(TransformerIdentityImpl.java:1043)
at XalanExceptionBugTester.main(XalanExceptionBugTester.java:125)
--------------------------------------
For either exception this is true:
- the RuntimeException or SAXException is not quietly swallowed anymore.
- Xalan's TransformerImpl.postExceptionFromThread(Exception e) is not involved
anymore
- The only Xalan method on the stack at the throw point is the last line of
TransformerIdentityImpl.startElement...) which will not do anything with the
exception but throw it.
I don't think this is a bug anymore. If anyone still thinks there still is a
problem then please re-open append comments to this bug. Also if there is still
a bug we'll move this over to Xerces because Xalan isn't on the stack frame at
the throw point except for one trivial stack frame.
Regards,
Brian Minchau