Speziell für pythoncom, die Fehler-Codes, die mehr als kryptische führen. Dies liegt daran, dass Pythoncom sie intern als eine 32-Bit-Ganzzahl mit Vorzeichen darstellt, wenn die korrekte Darstellung eine 32-Bit-Ganzzahl ist, die unsigned ist. Daher ist die Konvertierung, die Sie in der Stapelüberwachung sehen, falsch.
Insbesondere ist Ihre Ausnahme, nach Pythoncom, -2147352567, und Ihr (aus Mangel an einem besseren Wort) Err.Number ist -2146788248.
Dies jedoch einige Probleme verursacht, wenn für bestimmte Fehler zu beobachten, wie unten:
DISP_E_EXCEPTION = 0x80020009
#...
#except pywintypes.com_error as e:
# print repr(e)
# #pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146788248), None)
# hr = e.hresult
hr = -2147352567
if hr == DISP_E_EXCEPTION:
pass #This never occurs
else:
raise
Um zu sehen, warum diese Probleme hat, sehen wir uns in diese Fehlercodes:
>>> DISP_E_EXCEPTION = 0x80020009
>>> DISP_E_EXCEPTION
2147614729L
>>> my_hr = -2147352567
>>> my_hr == DISP_E_EXCEPTION
False
Auch dies ist weil Python die Konstante als positiv deklariert sieht und Pythoncoms falsche Deklaration als negativ interpretiert. Natürlich schlägt die offensichtlichste Lösung fehl:
>>> hex(my_hr)
'-0x7ffdfff7'
Die Lösung besteht darin, die Zahl richtig zu interpretieren. Glücklicherweise ist die Darstellung von Pythoncom reversibel. Wir müssen die negative Zahl als 32-Bit-Ganzzahl mit Vorzeichen interpretieren, dann interpretieren, dass als unsigned integer:
def fix_com_hresult(hr):
import struct
return struct.unpack("L", struct.pack("l", hr))[0]
>>> DISP_E_EXCEPTION = 0x80020009
>>> my_hr = -2147352567
>>> my_hr == DISP_E_EXCEPTION
False
>>> fixed_hr = fix_com_hresult(my_hr)
>>> fixed_hr
2147614729L
>>> fixed_hr == DISP_E_EXCEPTION
True
So setzen sie alle zusammen, müssen Sie fix_com_hresult() auf diesem Ergebnis laufen von pythoncom im Wesentlichen die ganze Zeit.
Da in der Regel müssen Sie dies tun, wenn Ausnahmen Überprüfung, habe ich diese Funktionen:
def fix_com_exception(e):
e.hresult = fix_com_hresult(e.hresult)
e.args = [e.hresult] + list(e.args[1:])
return e
def fix_com_hresult(hr):
import struct
return struct.unpack("L", struct.pack("l", hr))[0]
die dann verwendet werden können, wie Sie erwarten:
DISP_E_EXCEPTION = 0x80020009
try:
#failing call
except pywintypes.com_error as e:
print repr(e)
#pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2146788248), None)
fix_com_exception(e)
print repr(e)
#pywintypes.com_error: (2147614729L, 'Exception occurred.', (0, None, None, None, 0, -2146788248), None)
if e.hresult == DISP_E_EXCEPTION:
print "Got expected failure"
else:
raise
Ich war nicht in der Lage ein finden MSDN Dokument, das alle HRESULTs auflistet, aber ich fand das: http://www.megos.ch/support/doserrors_e.txt
Auch, da Sie es haben, sollte fix_com_hresult() auch auf Ihrem erweiterten Fehlercode (-2 ausgeführt werden 146788248), aber wie Euro Micelli sagte, hilft es Ihnen in diesem speziellen Fall nicht :)
+1 Großartig b reacdown der COM-Fehlercodes –