- PyObject *exception, *stackTrace;\r
- char *message;\r
- PyErr_Fetch(&exceptionType, &exception, &stackTrace);\r
- message = PyUnicode_AsUTF8(exception);\r
- throwException(env, RUNTIME_EXCEPTION, message);\r
+ PyObject *exception, *traceback;\r
+ PyErr_Fetch(&exceptionType, &exception, &traceback);\r
+\r
+ {\r
+ PyObject *tracebackModule = PyImport_ImportModule("traceback");\r
+ if (tracebackModule != NULL) {\r
+ PyObject *formatExc = PyDict_GetItemString(PyModule_GetDict(tracebackModule), "format_exception");\r
+ if (formatExc != NULL) {\r
+ PyObject *args = PyTuple_Pack(3, exceptionType, exception, traceback);\r
+ PyObject *message = PyObject_CallObject(formatExc, args);\r
+ if (message != NULL) {\r
+ PyObject *emptyStr = PyUnicode_FromString("");\r
+ PyObject *joined = PyUnicode_Join(emptyStr, message);\r
+ char *messageStr = PyUnicode_AsUTF8(joined);\r
+ throwPythonException(env, messageStr);\r
+ Py_DECREF(joined);\r
+ Py_DECREF(emptyStr);\r
+ Py_DECREF(message);\r
+ }\r
+ else {\r
+ throwPythonException(env, "Internal error, no message");\r
+ }\r
+ Py_DECREF(args);\r
+ Py_DECREF(formatExc);\r
+ }\r
+ else {\r
+ throwPythonException(env, "Internal error, no format_exc function");\r
+ }\r
+ Py_DECREF(tracebackModule);\r
+ }\r
+ else {\r
+ throwPythonException(env, "Internal error, no traceback module");\r
+ }\r
+ }\r