On Tue, 2011-04-19 at 08:08 +0100, Phil Thompson wrote: > On Tue, 19 Apr 2011 08:46:13 +0200, Benjamin Kloster > <[email protected]> wrote: > > On Mon, 2011-04-18 at 22:18 +0100, Phil Thompson wrote: > >> On Mon, 18 Apr 2011 14:07:13 +0200, Benjamin Kloster > >> <[email protected]> wrote: > >> > Hi everyone, > >> > twice now I've stumbled over a subtle bug when subclassing QObject. > >> > When > >> > the getter of a python property raises an AttributeError for any > >> > attribute or object, PyQt seems to reraise this error improperly, > >> > clearing the traceback and often reporting a false object type and > >> > attribute name. See the attached script for a minimal example. > >> > > >> > Regards, > >> > Ben > >> > >> It's working as it should. > >> > >> If the getter raises an AttributeError Python then calls any > __getattr__ > >> method. If there is no method then the exception raised by the getter > is > >> propagated. If there is a __getattr__ then the getter exception is > >> discarded and the exception raised by __getattr__ is propagated. > >> > >> QObject implements __getattr__ so the exception raised by the failure > of > >> QtCore.iDontExist is discarded. The exception that QObject.__getattr__ > >> raises is what you are seeing. > >> > >> Phil > >> > > > > The normal behavior of a Python object is to report the first > > AttributeError ("'module' object has no attribute 'iDontExist'). At > > least in Python 2.6, 2.7 and 3.2 it is. Just replace "QtCore.QObject" > > with "object" in the example to reproduce this. > > > > Especially if a getter is rather involved and maybe even calls third > > party libraries that produce the original AttributeError, debugging > > becomes confusing at best with PyQt's behavior. > > > > If it's not feasible to implement the correct (i.e. standard Python) > > error reporting, I can live with that. However, I couldn't find any note > > of this caveat in PyQt's documentation. So if it's really not there, it > > should probably be added. > > The behaviour *is* the standard Python behaviour - it's not a PyQt thing. > > Change "QtCore.QObject" with "object" and add a __getattr__ method that > raises an exception and you'll see. > > Phil >
Right. Sorry, my bad for not reading your first response correctly. Anyway, I hope some poor souls will find this thread via Google when they run into the same surprise. _______________________________________________ PyQt mailing list [email protected] http://www.riverbankcomputing.com/mailman/listinfo/pyqt
