bt2: don't print previous causes in causes created from bt2._Error
[babeltrace.git] / src / bindings / python / bt2 / bt2 / native_bt_log_and_append_error.h
index 11b6e414e1ec435e99a7575c912e84eabc2cb090..801a43c0fbf5614cff42586a3cdf0749da907264 100644 (file)
@@ -22,6 +22,8 @@
  * THE SOFTWARE.
  */
 
+#include <stdbool.h>
+
 #include "logging/comp-logging.h"
 
 static
@@ -35,9 +37,10 @@ void restore_current_thread_error_and_append_exception_chain_recursive(
        PyObject *py_exc_cause_value;
        PyObject *py_exc_type = NULL;
        PyObject *py_exc_tb = NULL;
+       PyObject *py_bt_error_msg = NULL;
        GString *gstr = NULL;
 
-       /* If this exception has a cause, handle that one first. */
+       /* If this exception has a (Python) cause, handle that one first. */
        py_exc_cause_value = PyException_GetCause(py_exc_value);
        if (py_exc_cause_value) {
                restore_current_thread_error_and_append_exception_chain_recursive(
@@ -46,17 +49,20 @@ void restore_current_thread_error_and_append_exception_chain_recursive(
                        self_message_iterator, module_name);
        }
 
-       /*
-        * If the raised exception is a bt2._Error, restore the wrapped error.
-        */
+       py_exc_tb = PyException_GetTraceback(py_exc_value);
+
        if (PyErr_GivenExceptionMatches(py_exc_value, py_mod_bt2_exc_error_type)) {
+               /*
+                * If the raised exception is a bt2._Error, restore the wrapped
+                * error.
+                */
                PyObject *py_error_swig_ptr;
                const bt_error *error;
                int ret;
 
                /*
-                * We never raise a bt2._Error with a cause: it should be the
-                * end of the chain.
+                * We never raise a bt2._Error with a (Python) cause: it should
+                * be the end of the chain.
                 */
                BT_ASSERT(!py_exc_cause_value);
 
@@ -74,19 +80,37 @@ void restore_current_thread_error_and_append_exception_chain_recursive(
                        SWIGTYPE_p_bt_error, 0);
                BT_ASSERT(ret == 0);
 
+               Py_DECREF(py_error_swig_ptr);
+
                BT_CURRENT_THREAD_MOVE_ERROR_AND_RESET(error);
 
-               Py_DECREF(py_error_swig_ptr);
-       }
+               /*
+                * Append a cause with just the traceback and message, not the
+                * full str() of the bt2._Error.  We don't want the causes of
+                * this bt2._Error to be included in the cause we create.
+                */
+               gstr = bt_py_common_format_tb(py_exc_tb, active_log_level);
+               if (!gstr) {
+                       /* bt_py_common_format_tb has already warned. */
+                       goto end;
+               }
 
-       py_exc_type = PyObject_Type(py_exc_value);
-       py_exc_tb = PyException_GetTraceback(py_exc_value);
+               g_string_prepend(gstr, "Traceback (most recent call last):\n");
 
-       gstr = bt_py_common_format_exception(py_exc_type, py_exc_value,
-                       py_exc_tb, active_log_level, false);
-       if (!gstr) {
-               /* bt_py_common_format_exception has already warned. */
-               goto end;
+               py_bt_error_msg = PyObject_GetAttrString(py_exc_value, "_msg");
+               BT_ASSERT(py_bt_error_msg);
+
+               g_string_append_printf(gstr, "\nbt2._Error: %s",
+                       PyUnicode_AsUTF8(py_bt_error_msg));
+       } else {
+               py_exc_type = PyObject_Type(py_exc_value);
+
+               gstr = bt_py_common_format_exception(py_exc_type, py_exc_value,
+                               py_exc_tb, active_log_level, false);
+               if (!gstr) {
+                       /* bt_py_common_format_exception has already warned. */
+                       goto end;
+               }
        }
 
        if (self_component_class) {
@@ -111,6 +135,7 @@ end:
        Py_XDECREF(py_exc_cause_value);
        Py_XDECREF(py_exc_type);
        Py_XDECREF(py_exc_tb);
+       Py_XDECREF(py_bt_error_msg);
 }
 
 /*
@@ -228,15 +253,17 @@ bt_logging_level get_self_message_iterator_log_level(
 }
 
 static inline
-void loge_exception_append_cause(const char *module_name, int active_log_level)
+void loge_exception_append_cause_clear(const char *module_name, int active_log_level)
 {
        log_exception_and_maybe_append_cause(BT_LOG_ERROR, active_log_level,
                true, NULL, NULL, NULL, module_name);
+       PyErr_Clear();
 }
 
 static inline
-void logw_exception(int active_log_level)
+void logw_exception_clear(int active_log_level)
 {
        log_exception_and_maybe_append_cause(BT_LOG_WARNING, active_log_level,
                false, NULL, NULL, NULL, NULL);
+       PyErr_Clear();
 }
This page took 0.025973 seconds and 4 git commands to generate.