[pywin32-bugs] [ pywin32-Bugs-723837 ] PyHANDLE destructor triggers a SystemError
OLD project page for the Python extensions for Windows
Brought to you by:
mhammond
From: SourceForge.net <no...@so...> - 2003-04-20 04:01:40
|
Bugs item #723837, was opened at 2003-04-19 05:03 Message generated for change (Comment added) made by mhammond You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=551954&aid=723837&group_id=78018 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Jason Orendorff (jorend) Assigned to: Mark Hammond (mhammond) Summary: PyHANDLE destructor triggers a SystemError Initial Comment: This code is in PyHANDLE.cpp: /*static*/ void PyHANDLE::deallocFunc(PyObject *ob) { // Call virtual method Close ((PyHANDLE *)ob)->Close(); PyErr_Clear(); // can not leave pending exceptions in destructors. delete (PyHANDLE *)ob; } If this is called because an unrelated exception occurred, it incorrectly clears the exception. For example, suppose I have Python code that calls a Python function f1(). This function successfully creates a PyHANDLE, stores it in a local varaible, and then raises an unrelated exception. The caller, f2(), catches the exception. At this point, the PyHANDLE still exists because the traceback object has a reference to it (indirectly). Now suppose f2() throws an exception. The previous traceback object is now released (replaced by the new traceback). The PyHANDLE object is decref'd and freed. PyHANDLE::deallocFunc() is called. The exception that f2() threw is now cleared. This results in a SystemError. The attached test case reproduces it. I think it should be if (!((PyHANDLE *)ob)->Close()) PyErr_Clear(); but I'm not sure. ---------------------------------------------------------------------- >Comment By: Mark Hammond (mhammond) Date: 2003-04-20 14:01 Message: Logged In: YES user_id=14198 This is a little nasty. I think the PyErr_Clear call is a hack, but Python prints a warning in some cases. The semantics for exceptions during object destruction are hard, and I will need to look into things a little more - but in the meantime, please see the new win32\tests\handles.py - your test case with some additions. These additions exercise some of these other cases, which will hopefully allow you to see my dilemma. I've been meaning to move to unittest, and this gave me the push I needed - thanks! I will probably move some of the other "demos" code into tests where it belongs. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=551954&aid=723837&group_id=78018 |