[ https://issues.apache.org/jira/browse/DERBY-2472?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Knut Anders Hatlen updated DERBY-2472: -------------------------------------- Attachment: setnext.stat setnext.diff I went through all the calls to SQLException.setNextException() in the engine code to see if there were more problems with the chaining. Most of them seemed OK, as they for instance cleaned up after an error and put the subsequent exceptions into the next chain. In those cases initCause() is not necessary because the subsequent errors are not causing the first error, and the first error is what is thrown to the caller. The problems I found, were: 1) EmbedStatement.executeBatch() catches SQLException and re-throws it as BatchUpdateException. It only links it to the original exception with setNextException(), but should also have used initCause(). 2) EmbedResultSet.closeOnTransactionError() tries to close the ResultSet, and if close() fails, it throws the exception from close() with a next pointer to the original exception. It should always throw the original exception, and instead have a next pointer to the exception thrown from close(). No need for initCause() since the exceptions don't necessarily cause each other, and you'll always get the original (and most interesting) exception. 3) ImportReadData.realOpenFile() sets the cause of the SQLException by manually creating an SQLException with the same message as the original Java exception and calling setNextException(). Instead, it should use factory methods which performs the correct chaining. The attached patch fixes these issues. Derbyall and suites.All ran cleanly. > Use Throwable.initCause() to improve error reporting > ---------------------------------------------------- > > Key: DERBY-2472 > URL: https://issues.apache.org/jira/browse/DERBY-2472 > Project: Derby > Issue Type: Improvement > Components: JDBC, Miscellaneous > Affects Versions: 10.3.0.0 > Reporter: Kristian Waagan > Assignee: Knut Anders Hatlen > Priority: Minor > Attachments: derby-2472_initial_patch.diff, embedsqlexception.diff, > embedsqlexception.stat, initCause.diff, initCause.stat, initCause2.diff, > initCause2.stat, seenext.diff, seenext.stat, setnext.diff, setnext.stat, > setStackTrace-v2.diff, setStackTrace.diff, standardexception.diff, > standardexception.stat > > > As Derby has moved to J2SE 1.4, Throwable.initCause() can now be used to > improve error reporting. > As stated in the initial commit (that was backed out, see below): > 'Set Throwable.initCause() in a couple of locations at the JDBC level where > we setup nested SQLExceptions. > This means that automatically the stack trace for a database failed to start > includes the reason > for the failure, rather than just "see next exception". This is a great help > when running > JUnit tests and getting failures to start a database.' > The initial commit was backed out because it broke numerous tests under JDK > 1.6, and the author indicated he had no time to investigate. > The patch caused no failures when running the tests with Java SE 5.0. -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.