// Copyright (c) Corporation for National Research Initiatives package org.python.core; import java.io.*; /** * A wrapper for all python exception. Note that the wellknown * python exception are <b>not</b> subclasses of PyException. * Instead the python exception class is stored in the * <code>type</code> field and value or class instance is stored * in the <code>value</code> field. */ public class PyException extends RuntimeException { /** * The python exception class (for class exception) or * identifier (for string exception). */ public PyObject type; /** * The exception instance (for class exception) or exception * value (for string exception). */ public PyObject value = Py.None; public PyTraceback traceback; private boolean instantiated = false; public void instantiate() { if (!instantiated) { // repeatedly, replace a tuple exception with its first item while (type instanceof PyTuple && type.__len__() > 0) { type = type.__getitem__(0); } if (type instanceof PyClass && (!(value instanceof PyInstance && __builtin__.isinstance(value, (PyClass) type)))) { //System.out.println("value: "+value); if (value instanceof PyTuple) { value = ((PyClass) type).__call__(((PyTuple) value).getArray()); } else { if (value == Py.None) { value = ((PyClass) type).__call__(Py.EmptyObjects); } else { value = ((PyClass) type).__call__(new PyObject[] { value }); } } } instantiated = true; } } public PyException() { //System.out.println("PyException"); //super.printStackTrace(); this(Py.None, Py.None); } public PyException(PyObject type) { this(type, Py.None); } public PyException(PyObject type, PyObject value) { this.type = type; this.value = value; PyFrame frame = Py.getFrame(); traceback = new PyTraceback(frame); if (frame != null && frame.tracefunc != null) { frame.tracefunc = frame.tracefunc.traceException(frame, this); } } public PyException(PyObject type, String value) { this(type, new PyString(value)); } public PyException(PyObject type, PyObject value, PyTraceback traceback) { this.type = type; this.value = value; this.traceback = traceback; } private boolean printingStackTrace = false; public void printStackTrace() { Py.printException(this); } public synchronized void printStackTrace(PrintStream s) { //System.err.println("printStackTrace: "+s+", "+printingStackTrace); if (printingStackTrace) { super.printStackTrace(s); } else { try { printingStackTrace = true; Py.displayException(type, value, traceback, new PyFile(s)); } finally { printingStackTrace = false; } } } public synchronized void super__printStackTrace(PrintWriter w) { try { printingStackTrace = true; super.printStackTrace(w); } finally { printingStackTrace = false; } //Py.printException(this, null, new PyFile(s)); } public synchronized String toString() { ByteArrayOutputStream buf = new ByteArrayOutputStream(); if (!printingStackTrace) { printStackTrace(new PrintStream(buf)); } return buf.toString(); } }