Hi Jeffrey,

> I had thought that exc_info was
> automatically cleared at the end of any except block that caught an
> exception, but apparently that isn't the case. Is this a bug in 3.0,
> or do we need to keep sys.exc_clear() around?

The explanation seems to be that, while exc_info is cleared immediately, the
thread state exception fields are only cleaned up at the end of
PyEval_EvalFrameEx. The following patch fixes it for me:

diff -r adc2f5003ea3 Python/ceval.c
--- a/Python/ceval.c    Sat Mar 29 06:06:52 2008 +0100
+++ b/Python/ceval.c    Sat Mar 29 13:46:27 2008 +0100
@@ -1477,6 +1477,12 @@ PyEval_EvalFrameEx(PyFrameObject *f, int
                                        "'finally' pops bad exception");
                                why = WHY_EXCEPTION;
                        }
+                       if (tstate->frame->f_exc_type != NULL)
+                               reset_exc_info(tstate);
+                       else {
+                               assert(tstate->frame->f_exc_value == NULL);
+                               assert(tstate->frame->f_exc_traceback == NULL);
+                       }
                        Py_DECREF(v);
                        break;


Regards

Antoine.


_______________________________________________
Python-3000 mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000
Unsubscribe: 
http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com

Reply via email to