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

Reply via email to