From f8f212403765ac5f8c4c08ab6b7d7a78c1c9a6f3 Mon Sep 17 00:00:00 2001 From: tuorjr Date: Thu, 1 Dec 2016 16:31:57 +0000 Subject: [PATCH] Get Python traceback output in the messages of exceptions from the pythonlink feature. git-svn-id: https://www.simantics.org/svn/simantics-incubator/reino@1703 e36c2e66-7d30-0410-bdb2-d9e1f5a6d952 --- .../jnipython.dll | Bin 32768 -> 33792 bytes .../src/sclpy.c | 103 ++++++++++++------ .../src/sclpy.h | 2 +- .../simantics/pythonlink/PythonException.java | 21 ++++ 4 files changed, 90 insertions(+), 36 deletions(-) create mode 100644 org.simantics.pythonlink/src/org/simantics/pythonlink/PythonException.java diff --git a/org.simantics.pythonlink.win32.x86_64/jnipython.dll b/org.simantics.pythonlink.win32.x86_64/jnipython.dll index 76fe378a6e2aeb6b316acfbebe60d961a520b73d..7fff774adac1bb1b1d2c5ffbffa6043e44d877e1 100644 GIT binary patch delta 10870 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 delta 9892 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 env, exClass, message ); } +jint throwPythonException( JNIEnv *env, char *message ) { + return throwException( env, PYTHON_EXCEPTION, message ); +} + jint throwIllegalArgumentException( JNIEnv *env, char *message ) { return throwException( env, ILLEGAL_ARGUMENT_EXCEPTION, message ); } @@ -581,7 +585,7 @@ jobjectArray pythonSequenceAsStringArray(JNIEnv *env, PyObject *seq) { (*env)->SetObjectArrayElement(env, array, i, value); } else { - throwException(env, RUNTIME_EXCEPTION, "List item not a string"); + throwPythonException(env, "List item not a string"); return NULL; } } @@ -603,7 +607,7 @@ jdoubleArray pythonSequenceAsDoubleArray(JNIEnv *env, PyObject *seq) { (*env)->SetDoubleArrayRegion(env, array, i, 1, &value); } else { - throwException(env, RUNTIME_EXCEPTION, "List item not a floating point value"); + throwPythonException(env, "List item not a floating point value"); return NULL; } } @@ -662,7 +666,7 @@ jbooleanArray pythonSequenceAsBooleanArray(JNIEnv *env, PyObject *seq) { (*env)->SetBooleanArrayRegion(env, array, i, 1, &value); } else { - throwException(env, RUNTIME_EXCEPTION, "List item not a boolean"); + throwPythonException(env, "List item not a boolean"); return NULL; } } @@ -684,7 +688,7 @@ jintArray pythonSequenceAsIntegerArray(JNIEnv *env, PyObject *seq) { (*env)->SetIntArrayRegion(env, array, i, 1, &value); } else { - throwException(env, RUNTIME_EXCEPTION, "List item not an integer"); + throwPythonException(env, "List item not an integer"); return NULL; } } @@ -706,7 +710,7 @@ jlongArray pythonSequenceAsLongArray(JNIEnv *env, PyObject *seq) { (*env)->SetLongArrayRegion(env, array, i, 1, &value); } else { - throwException(env, RUNTIME_EXCEPTION, "List item not an integer"); + throwPythonException(env, "List item not an integer"); return NULL; } } @@ -729,7 +733,7 @@ jobject pythonArrayAsNDArray(JNIEnv *env, PyArrayObject *array) { int i; if (len > JAVA_MAXINT) { - throwException(env, RUNTIME_EXCEPTION, "Array too large"); + throwPythonException(env, "Array too large"); return NULL; } @@ -872,7 +876,7 @@ JNIEXPORT void JNICALL Java_org_simantics_pythonlink_PythonContext_setPythonNDAr PyObject *module = (PyObject*)contextID; if (!hasNumpy) { - throwException(env, RUNTIME_EXCEPTION, "Importing numpy failed"); + throwPythonException(env, "Importing numpy failed"); return; } @@ -909,11 +913,40 @@ JNIEXPORT jint JNICALL Java_org_simantics_pythonlink_PythonContext_executePython PyObject *exceptionType = PyErr_Occurred(); if (exceptionType != NULL) { - PyObject *exception, *stackTrace; - char *message; - PyErr_Fetch(&exceptionType, &exception, &stackTrace); - message = PyUnicode_AsUTF8(exception); - throwException(env, RUNTIME_EXCEPTION, message); + PyObject *exception, *traceback; + PyErr_Fetch(&exceptionType, &exception, &traceback); + + { + PyObject *tracebackModule = PyImport_ImportModule("traceback"); + if (tracebackModule != NULL) { + PyObject *formatExc = PyDict_GetItemString(PyModule_GetDict(tracebackModule), "format_exception"); + if (formatExc != NULL) { + PyObject *args = PyTuple_Pack(3, exceptionType, exception, traceback); + PyObject *message = PyObject_CallObject(formatExc, args); + if (message != NULL) { + PyObject *emptyStr = PyUnicode_FromString(""); + PyObject *joined = PyUnicode_Join(emptyStr, message); + char *messageStr = PyUnicode_AsUTF8(joined); + throwPythonException(env, messageStr); + Py_DECREF(joined); + Py_DECREF(emptyStr); + Py_DECREF(message); + } + else { + throwPythonException(env, "Internal error, no message"); + } + Py_DECREF(args); + Py_DECREF(formatExc); + } + else { + throwPythonException(env, "Internal error, no format_exc function"); + } + Py_DECREF(tracebackModule); + } + else { + throwPythonException(env, "Internal error, no traceback module"); + } + } } (*env)->ReleaseStringUTFChars(env, statement, utfchars); @@ -930,12 +963,12 @@ JNIEXPORT jstring JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonS PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return 0; } if (!PyUnicode_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a string"); + throwPythonException(env, "Python variable not a string"); return 0; } @@ -952,12 +985,12 @@ JNIEXPORT jobjectArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPy PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return 0; } if (!PySequence_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a sequence"); + throwPythonException(env, "Python variable not a sequence"); return 0; } @@ -974,12 +1007,12 @@ JNIEXPORT jboolean JNICALL Java_org_simantics_pythonlink_PythonContext_getPython PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return 0; } if (!PyBool_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a boolean"); + throwPythonException(env, "Python variable not a boolean"); return 0; } @@ -993,12 +1026,12 @@ JNIEXPORT jbooleanArray JNICALL Java_org_simantics_pythonlink_PythonContext_getP PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return 0; } if (!PySequence_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a sequence"); + throwPythonException(env, "Python variable not a sequence"); return 0; } @@ -1015,12 +1048,12 @@ JNIEXPORT jlong JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonLon PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return 0; } if (!PyLong_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not an integer"); + throwPythonException(env, "Python variable not an integer"); return 0; } @@ -1037,12 +1070,12 @@ JNIEXPORT jintArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPytho PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return NULL; } if (!PySequence_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a sequence"); + throwPythonException(env, "Python variable not a sequence"); return NULL; } @@ -1059,12 +1092,12 @@ JNIEXPORT jlongArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPyth PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return NULL; } if (!PySequence_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a sequence"); + throwPythonException(env, "Python variable not a sequence"); return NULL; } @@ -1081,12 +1114,12 @@ JNIEXPORT jdouble JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonD PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return 0.0; } if (!PyFloat_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a float"); + throwPythonException(env, "Python variable not a float"); return 0.0; } @@ -1103,12 +1136,12 @@ JNIEXPORT jdoubleArray JNICALL Java_org_simantics_pythonlink_PythonContext_getPy PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return NULL; } if (!PySequence_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not a sequence"); + throwPythonException(env, "Python variable not a sequence"); return NULL; } @@ -1122,7 +1155,7 @@ JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonN PyObject *module = (PyObject*)contextID; if (!hasNumpy) { - throwException(env, RUNTIME_EXCEPTION, "Importing numpy failed"); + throwPythonException(env, "Importing numpy failed"); return NULL; } @@ -1131,17 +1164,17 @@ JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonN PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return NULL; } if (!PyArray_Check(value)) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not an ndarray"); + throwPythonException(env, "Python variable not an ndarray"); return NULL; } if (PyArray_TYPE((PyArrayObject*)value) != NPY_DOUBLE) { - throwException(env, RUNTIME_EXCEPTION, "Only ndarrays of type double are supported"); + throwPythonException(env, "Only ndarrays of type double are supported"); return NULL; } @@ -1159,7 +1192,7 @@ JNIEXPORT jobject JNICALL Java_org_simantics_pythonlink_PythonContext_getPythonV PyObject *value = PyDict_GetItem(PyModule_GetDict(module), pythonName); if (value == NULL) { - throwException(env, RUNTIME_EXCEPTION, "Python variable not found"); + throwPythonException(env, "Python variable not found"); return NULL; } diff --git a/org.simantics.pythonlink.win32.x86_64/src/sclpy.h b/org.simantics.pythonlink.win32.x86_64/src/sclpy.h index 4a2c7de..4032d48 100644 --- a/org.simantics.pythonlink.win32.x86_64/src/sclpy.h +++ b/org.simantics.pythonlink.win32.x86_64/src/sclpy.h @@ -27,7 +27,7 @@ #define JAVA_MAXINT (0x7fffffff) -#define RUNTIME_EXCEPTION "java/lang/RuntimeException" +#define PYTHON_EXCEPTION "org/simantics/pythonlink/PythonException" #define ILLEGAL_ARGUMENT_EXCEPTION "java/lang/IllegalArgumentException" #define OBJECT_CLASS "java/lang/Object" #define STRING_CLASS "java/lang/String" diff --git a/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonException.java b/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonException.java new file mode 100644 index 0000000..7c4d2a5 --- /dev/null +++ b/org.simantics.pythonlink/src/org/simantics/pythonlink/PythonException.java @@ -0,0 +1,21 @@ +package org.simantics.pythonlink; + +public class PythonException extends RuntimeException { + private static final long serialVersionUID = 3015300166106850889L; + + public PythonException() { + super(); + } + + public PythonException(String message) { + super(message); + } + + public PythonException(String message, Throwable cause) { + super(message, cause); + } + + public PythonException(Throwable cause) { + super(cause); + } +} -- 2.45.2