Details
Details
Assignee
Michael Offner
Michael OffnerReporter
Brad Wood
Brad WoodPriority
New Issue warning screen
Before you create a new Issue, please post to the mailing list first https://dev.lucee.org
Once the issue has been verified, one of the Lucee team will ask you to file an issue
Created 3 June 2022 at 23:19
Updated 15 September 2022 at 16:07
Throwing an existing CFCatch exception object with
throw( object=exception );
will result in a new exception which has the same stack trace and tag context of the original error. However if
exception
is serialized and them deserialized, using it in a throw will NOT keep the original stack trace and tag context, even though this information is part of the new struct.https://trycf.com/gist/d94608eaaca61c89bca5422940b3f495/lucee5?theme=monokai
// Create an initial exception try { throw( message="error message", detail="error detail", type="error_type" ); } catch ( any e ) { exception = e } dump('Original Error thrown from #exception.tagContext[1].template#:#exception.tagContext[1].line#' ) // Rethrow the original exception object try { throw( object=exception ); } catch ( any e ) { exception = e } dump('Rethrown Error has original stack/tag context: #exception.tagContext[1].template#:#exception.tagContext[1].line#' ) // now serialize and deserialize the exception to a CFML struct: exception = deserializeJSON( serializeJSON( exception ) ) // Now Rethrow the CFML struct try { throw( object=exception ); } catch ( any e ) { exception = e } dump('This error does not retain the original stack/tag context: #exception.tagContext[1].template#:#exception.tagContext[1].line#' )
The logic for this is here. When the
object
argument to thethrow()
call is an actual CFCatch block, this code is run:https://github.com/lucee/Lucee/blob/6.0/core/src/main/java/lucee/runtime/tag/Throw.java#L148
but when the incoming
object
is just a struct, the stacktrace and tag context keys are not even used:https://github.com/lucee/Lucee/blob/6.0/core/src/main/java/lucee/runtime/tag/Throw.java#L157-L192
It should be possible to parse the stack trace string and re-create an array of StackTraceElement objects that can be set back into the Throwable using
setStackTrace()
.