db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-2472) Use Throwable.initCause() to improve error reporting
Date Sun, 20 May 2007 16:21:16 GMT

    [ https://issues.apache.org/jira/browse/DERBY-2472?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12497266
] 

Knut Anders Hatlen commented on DERBY-2472:
-------------------------------------------

The patch that replaced StandardException.setNestedException() with Throwable.initCause()
may have introduced a problem in GenericLanguageConnectionContext.dropAllDeclaredGlobalTempTables()
and BasicDependencyManager.coreInvalidateFor(). These two methods accumulate StandardExceptions
which are thrown from within a loop, and the exceptions are re-thrown when the loop has ended.
The exception that is re-thrown is the last exception that was caught, and it has all previously
caught exceptions as its cause. The code that accumulates the exceptions looks like this:

	} catch (StandardException e) {
		e.initCause(topLevelStandardException);
		topLevelStandardException = e;
	}

The problem is that initCause() can only be called once on a Throwable, so if the StandardException
already has a cause, initCause() will throw an IllegalStateException. The old code would not
fail if this happened since setNestedException() would happily overwrite any existing nested
exception.

One solution is to call initCause() on the exception's cause (or the cause of the cause, etc)
if it has one. However, this wouldn't work if the last exception in the chain has been initialized
with null as cause, since null also blocks subsequent calls to initCause(). Therefore, I suggest
that we change the code so that it tries to chain the exceptions as suggested above, but if
the StandardException cannot add a new exception to its chain, a new exception is created
with the same SQL state, message and stack trace, but with no cause, and the clone is inserted
into the chain instead.

> 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
>         Assigned To: Knut Anders Hatlen
>            Priority: Minor
>         Attachments: derby-2472_initial_patch.diff, embedsqlexception.diff, embedsqlexception.stat,
seenext.diff, seenext.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.


Mime
View raw message