Suraj Barkale schrieb:
> Hi,
> I am trying to automate Lotus Notes using comtypes and want to handle
> error conditions (e.g. wrong password) by catching COM exceptions.
> Unfortunately, Lotus Notes always gives error code -2147217504. So I
> decided to check the error description. Following is a sample COMError
> object:
> 
> COMError(-2147217504, None, (u'Notes error: Wrong Password. (Passwords
> are case sensitive - be sure to use correct upper and lower case.)',
> u'NotesSession', None, 0, None))
> 
> I checked the code of COMError in
> http://svn.python.org/view/python/tags/r251/Modules/_ctypes/_ctypes.c?rev=54864&view=auto
> and is seems to me that COMError objects should have "hresult, text,
> details" attributes. However, the COMError object I caught had only
> args attribute.
> 
> My questions are:
>         1. err.args[2][0] returns description. Can I get away with
> using err.args[2][0] without checking for error bounds (assuming only
> COMError is caught)?

I think so; at least that is the intent.

>         2. Will COMError grow "hresult, text, details" attributes in future?

It is a bug in Python 2.5 and 2.5.1 _ctypes module that COMError does not
have these attributes.  The bug is not present in Python 2.4.

I'll fix this in Python SVN asap; fortunately it seems that it is possible
to monkeypatch comtypes' COMError to add a workaround for the bug.
If you add the following code snippet to comtypes\__init__.py you can try
it out; I have already committed this to comtypes svn and added a test.
Please try it out if it works for you.

Thanks,
Thomas

<snippet>
try:
    COMError()
except TypeError:
    pass
else:
    # Python 2.5 and 2.5.1 have a bug in the COMError implementation:
    # The type has no __init__ method, and no hresult, text, and
    # details instance vars.  Work around this bug by monkeypatching
    # COMError.
    def monkeypatch_COMError():
        def __init__(self, hresult, text, details):
            self.hresult = hresult
            self.text = text
            self.details = details
            super(COMError, self).__init__(hresult, text, details)
        COMError.__init__ = __init__
        def __repr__(self):
            return "%s(%r, %r, %r)" % (self.__class__.__name__, self.hresult, 
self.text, self.details)
        COMError.__repr__ = __repr__
    monkeypatch_COMError()
    del monkeypatch_COMError
</snippet>


-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
comtypes-users mailing list
comtypes-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/comtypes-users

Reply via email to