diff oct-py-error.cc @ 423:6b9de18b4bdd

Eliminate remaining custom exception handling in favor of Octave errors * oct-py-error.cc, oct-py-error.h (pytave::error_python_exception): New function to generate an Octave error from an active Python error condition, based on pytave::fetch_exception_message. * oct-py-eval.cc (pytave::py_call_function, pytave::py_run_string_safe): Use it. * oct-py-types.cc (pytave::make_py_dict): Likewise. * oct-py-util.cc (pytave::py_objstore): Likewise. * pycall.cc (Fpycall): Remove exception handling logic. * pyeval.cc (Fpyeval): Likewise. * pyexec.cc (Fpyexec): Likewise. * exceptions.cc, exceptions.h: Delete. * Makefile.am (COMMON_SOURCE_FILES, PYTAVE_HEADER_FILES): Remove them.
author Mike Miller <mtmiller@octave.org>
date Thu, 04 May 2017 21:15:07 -0700
parents 8247f298fd16
children
line wrap: on
line diff
--- a/oct-py-error.cc	Thu May 04 17:13:38 2017 -0700
+++ b/oct-py-error.cc	Thu May 04 21:15:07 2017 -0700
@@ -24,9 +24,13 @@
 #  include <config.h>
 #endif
 
+#include <Python.h>
 #include <octave/error.h>
 
 #include "oct-py-error.h"
+#include "oct-py-eval.h"
+#include "oct-py-object.h"
+#include "oct-py-types.h"
 
 namespace pytave
 {
@@ -45,4 +49,36 @@
            must.c_str ());
   }
 
+  void
+  error_python_exception ()
+  {
+    const char *format_exception_only = "traceback.format_exception_only";
+
+    PyObject *ptype, *pvalue, *ptraceback;
+    PyErr_Fetch (&ptype, &pvalue, &ptraceback);
+    PyErr_NormalizeException (&ptype, &pvalue, &ptraceback);
+
+    python_object args = PyTuple_Pack (2, ptype, pvalue);
+    python_object lines = py_call_function (format_exception_only, args);
+
+    if (lines && PySequence_Check (lines))
+      {
+        Py_ssize_t len = PySequence_Size (lines);
+        python_object last_line = PySequence_GetItem (lines, len - 1);
+
+        std::string msg = extract_py_str (last_line);
+        if (msg.back () == '\n')
+          msg.resize (msg.size () - 1);
+
+        error ("%s", msg.c_str ());
+      }
+    else
+      {
+        PyErr_Restore (ptype, pvalue, ptraceback);
+        PyErr_Print ();
+        error ("runtime failed to get exception information from %s",
+               format_exception_only);
+      }
+  }
+
 }