Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>Just for anyone interested... I spent a bit of time testing stuff because I wanted to find out how to get a proper stack trace whether a Python Exception (BaseException in fact, which is the base class) or a java.lang.Throwable (java base class for Exception, Error, etc.) is thrown... this code illustrates how to catch all line number refs correctly. </p> <pre><code>import sys import traceback import java print "hello world" def custom_hook( type, exc, tb ): if isinstance( sys.exc_info()[ 1 ], java.lang.Throwable ): sys.stderr.write( "AS JAVA:\n" ) sys.exc_info()[ 1 ].printStackTrace() # java part else: sys.stderr.write( "NO JAVA TRACE:\n" ) sys.stderr.write( "AS PYTHON:\n" ) traceback.print_exc() # useful for custom exception handling! sys.excepthook = custom_hook def handle_exc(): # generate either a java.lang.Throwable (uncomment the next line and comment out "a = 16 / 0" # java.lang.String( None ) # OR... a python-style BaseException: a = 16 / 0 class Task( java.lang.Runnable ): def run( self ): # NB the problem with all this stuff is that the Java stack trace shows # a java.lang.Throwable occurring at the last line of this code block... # print "lots of stuff first" # print "lots 2" # handle_exc() # print "lots 3" # print "lots of stuff after" try: print "lots of stuff first" print "lots 2" handle_exc() print "lots 3" print "lots of stuff after" # NB do not catch both (Python) BaseException and java.lang.Throwable... # except ( BaseException, java.lang.Throwable ), e: # the above means that the line no. in handle_exc is not shown when a BaseException # is thrown... except java.lang.Throwable, t: tb = sys.exc_info()[ 2 ] sys.stderr.write( "java.lang.Throwable thrown at: %s\n" % tb.tb_lineno ) raise t java.awt.EventQueue.invokeAndWait( Task() ) </code></pre> <p>After this one might think of writing a decorator to precede def run( self ) and similar methods so that you don't have to write out this catch-the-Throwable try-except block each time... specifically:</p> <pre><code>def throw_trap( function ): def wrapper(*args, **kvargs): try: return function( *args, **kvargs ) except java.lang.Throwable, t: tb = sys.exc_info()[ 2 ] while( tb ): sys.stderr.write( "thrown at: %s\n" % tb.tb_lineno ) tb = tb.tb_next raise t return wrapper def handle_exc(): java.lang.String( None ) # a = 16 / 0 class Task( java.lang.Runnable ): @throw_trap def run( self ): print "lots of stuff first" print "lots 2" handle_exc() print "lots 3" print "lots of stuff after" java.awt.EventQueue.invokeAndWait( Task() ) </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload