On Jun 17, 2013, at 1:12 AM, Peter Levart wrote:
> On 06/17/2013 08:06 AM, Jeroen Frijters wrote:
>> Nick Williams wrote:
>>> What if we also added a getStackFrames() method to Throwable? That would
>>> meet my needs but it would also satisfy what I'm observing is a desire
>>> to have a new API for this (StackFrame) instead of adding it to
>>> StackTraceElement. I'm very open to how it's implemented, as long as it
>>> satisfies my use case. :-)
>>>
>>> The stack trace of a Throwable can be "filled in" on demand when
>>> getStackTrace() is called the first time, so that the overhead isn't
>>> incurred when creating and throwing the exception. Presumably, we would
>>> need to do something similar with getStackFrames(), especially since
>>> calling it would be less common.
>>>
>>> Thoughts on this?
>> Yes that is reasonable, but I'd add a static method to StackFrame instead.
>> Something like StackFrame[] capture(Throwable).
>
> New API could be entirely unrelated to Throwable, if there was support for it
> in native code. Since there would have to be changes to the native code
> anyway to support this, why not create a separate API?
I'm not sure who's misunderstanding who. :-)
If some third party code that I have no control over throws an exception and I
catch that exception, or some other code catches the exception and passes it to
my code (because my code is a logging framework), I need to get the
StackFrame[] for _when the exception was thrown_. Not the StackFrame[] related
to my current method execution. How can that possibly be entirely unrelated to
throwable?
The way I understand Jereon's suggestion, I'm thinking StackFrame would look
like this:
public final class StackFrame {
public Executable method();
public String getFileName();
public int getLineNumber();
/** Shortcut for getModifiers() and Modifiers.NATIVE */
public int isNativeMethod();
/** Format exactly like StackTraceElement#toString() */
public String toString();
/** Gets current executing stack with number of frames skipped and max length
*/
public static StackFrame[] capture(int skipFrames, int maxLength, boolean
includeSourceInfo);
/** Gets current executing stack with no frames skipped and no max length */
public static StackFrame[] capture();
/** Gets stack from when Throwable was created. */
public static StackFrame[] capture(Throwable t);
}
But perhaps I am missing something.
Nick