my600080 has asked for the wisdom of the Perl Monks concerning the following question:

I need to catch the complete java error stack trace from inline java. For example, the following is my java error stack trace when I run inline java in perl:

com.image.exception.ConversionException: Delete: deletion failed: temp +3d5140d9-ef4e-4e36-b8c5-e90166bb02c5.png at com.image.utils.ImageConverter.get(ImageConverter.java:389) at com.image.utils.Index.createPage(Index.java:522) at com.image.utils.createPage(Index.java:465) at com.image.Index.createDoc(Index.java:290) at com.image.RemImag.idxDoc(RemImag.java:77) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc +essorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM +ethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at InlineJavaUserClassLink.invoke(InlineJavaUserClassLink.java +:11) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc +essorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM +ethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.perl.inline.java.InlineJavaUserClassLoader.invoke_via_l +ink(InlineJavaUserClassLoader.java:86) at org.perl.inline.java.InlineJavaUserClassLoader.invoke(Inlin +eJavaUserClassLoader.java:131) at org.perl.inline.java.InlineJavaProtocol.CallJavaMethod(Inli +neJavaProtocol.java:283) at org.perl.inline.java.InlineJavaProtocol.Do(InlineJavaProtoc +ol.java:41) at org.perl.inline.java.InlineJavaServer.ProcessCommand(Inline +JavaServer.java:153) at org.perl.inline.java.InlineJavaServer.ProcessCommand(Inline +JavaServer.java:142) at org.perl.inline.java.InlineJavaServerThread.run(InlineJavaS +erverThread.java:51)

But when I use the following to catch the stack trace:

if ( caught("java.lang.Exception") ) { my $exception = $@; my $msg = $exception->getMessage(); my $string_writer = new java::io::StringWriter(); my $print_writer = new java::io::PrintWriter($string_w +riter); $exception->printStackTrace($print_writer); my $line = $string_writer->toString(); $errorLog->error($attachmentFilePath . "\n" . $msg . " +\n" . $line); }

Only the following lines are recorded in the error log:

java.lang.NullPointerException at com.image.RemImag.idxDoc(RemImag.java:81) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc +essorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM +ethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at InlineJavaUserClassLink.invoke(InlineJavaUserClassLink.java +:11) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAcc +essorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingM +ethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.perl.inline.java.InlineJavaUserClassLoader.invoke_via_l +ink(InlineJavaUserClassLoader.java:86) at org.perl.inline.java.InlineJavaUserClassLoader.invoke(Inlin +eJavaUserClassLoader.java:131) at org.perl.inline.java.InlineJavaProtocol.CallJavaMethod(Inli +neJavaProtocol.java:283) at org.perl.inline.java.InlineJavaProtocol.Do(InlineJavaProtoc +ol.java:41) at org.perl.inline.java.InlineJavaServer.ProcessCommand(Inline +JavaServer.java:153) at org.perl.inline.java.InlineJavaServer.ProcessCommand(Inline +JavaServer.java:142) at org.perl.inline.java.InlineJavaServerThread.run(InlineJavaS +erverThread.java:51)

It seems that it cut off the first few lines which are very important for me.

How can I get the full stack trace by using inline java's exception caught?

Thanks!

Replies are listed 'Best First'.
Re: catch complete stack trace of inline java
by almut (Canon) on Jun 16, 2010 at 14:56 UTC

    Are you sure you're looking at the same exception?

    The first is "com.image.exception.ConversionException", while the one of the shorter trace is reported as "java.lang.NullPointerException".  Just wondering...

    Update: also, the line numbers differ for

    java.lang.NullPointerException at com.image.RemImag.idxDoc(RemImag.java:81) ... ^^

    vs. the corresponding line in the other trace

    com.image.exception.ConversionException: ... ... at com.image.RemImag.idxDoc(RemImag.java:77) ... ^^

    IOW, the difference doens't seem to be merely a few lines being cut off...

      Yes, it's exactly the same exception. And that confuses me too.