2017-12-18 3 views
0

läuft Ich bin mit Python 3.6.2 auf Windows 7.Python/win32com/versuchen und außer/überprüfen, ob Anwendung

ich eine kleine Funktion haben, prüfen Sie, ob sollten, wenn MS Excel bereits ist oder nicht ausgeführt wird. Die Funktion verhält sich ein wenig seltsam, hier würde Ihre Hilfe sehr geschätzt werden.

Die Funktion sollte prüfen, ob Excel läuft. Wenn ja, drucken Sie den Text und beenden Sie die Anwendung. Wenn nein, ist alles in Ordnung, weiter.

jetzt Mein Problem ist, wenn Excel der Try-Block ausgeführt wird, einschließlich dem Druck ausgeführt wird, aber nicht die sys.exit() UND die außer-Block als auch ausgeführt wird !? Wenn Excel NICHT läuft, dann ist alles in Ordnung, der Try-Block bricht ab und nur der except-Block wird ausgeführt.

Warum werden beide print-Anweisungen ausgeführt, wenn Excel ausgeführt wird?

Bitte helfen!

Hier ist mein Code:

def check_if_Excel_runs(): 
    import win32com.client 
    import sys 
    try: 
     win32com.client.GetActiveObject("Excel.Application") 
     # If there is NO error at this stage, Excel is already running 
     print('Excel is running, please close first') 
     sys.exit() 
    except: 
     print('Excel is NOT running, this is good!') 
    return 

check_if_Excel_runs() 

Mein Ausgang (wenn Excel ausgeführt wird):

Excel is running, please close first 
Excel is NOT running, this is good! 

Vielen Dank im Voraus!

UPDATE:

Ok, ich verstanden habe, dass ich nicht im Allgemeinen zu tun „außer“ ohne Einzelheiten enthält die Ausnahme, die ich behandeln möchten. Aber wie ermittle ich, welchen Typ die Ausnahme hat, die ich fangen will? Wenn ich mir die Fehlermeldung anschaue, ist es mir nicht klar.

com_error         Traceback (most recent call last) 
<ipython-input-39-70980aa1c5df> in <module>() 
    11  return 
    12 
---> 13 check_if_Excel_runs() 

<ipython-input-39-70980aa1c5df> in check_if_Excel_runs() 
     3  import sys 
     4  try: 
----> 5   win32com.client.GetActiveObject("Excel.Application") 
     6   # If there is NO error at this stage, Excel is already running 
     7   print('Excel is running, please close first') 

c:\users\chnn\appdata\local\programs\python\python36-32\lib\site-packages\win32com\client\__init__.py in GetActiveObject(Class, clsctx) 
    77 """ 
    78 resultCLSID = pywintypes.IID(Class) 
---> 79 dispatch = pythoncom.GetActiveObject(resultCLSID) 
    80 dispatch = dispatch.QueryInterface(pythoncom.IID_IDispatch) 
    81 return __WrapDispatch(dispatch, Class, resultCLSID = resultCLSID, clsctx = clsctx) 

com_error: (-2147221021, 'Operation unavailable', None, None) 

Nochmals vielen Dank für Ihre Hilfe, Leute!

+0

Die letzte Zeile sagt 'com_error: ...', also ist Ihre Ausnahme vom Typ 'com_error'. Sie benötigen weiterhin den Paketnamen. Das Eingeben von 'python com_error' in Google ergab' pythoncom.com_error', das ist also Ihr vollständiger Ausnahmetyp. – pschill

Antwort

0

Es passiert, weil sys.exit() auch eine Ausnahme auslöst.

0

Ich glaube, dass Ihr Problem ist, dass sys.exit() eine Ausnahme auslöst.

Sys.exit() wird beendet, indem eine System-Exit-Ausnahme ausgelöst wird. Sie können es nicht dort hinein geben und nur eine allgemeine catch all-Anweisung verwenden.

Hoffe, das hilft!

0

der Python-docs auf sys.exit() können Sie sehen, was das Problem ist hier:

This is implemented by raising the SystemExit exception, so cleanup actions specified by finally clauses of try statements are honored, and it is possible to intercept the exit attempt at an outer level.

Also, was passiert ist, dass die sys.exit() ausgeführt wird und versucht, das Programm zu beenden, indem die Systemexit werfen Ausnahme. Aber da Sie ein generisches geschrieben haben, außer Sie fangen die Ausnahme und dann drucken Sie die Nachricht.

Sie bieten daher ein hervorragendes Beispiel dafür, warum es keine gute Idee ist, generische Ausnahmen zu schreiben, da Sie damit Ausnahmen abfangen können, die Sie nicht abfangen wollen.Sie sollten für die Art der Ausnahme aussehen, dass

win32com.client.GetActiveObject("Excel.Application") 

wirft und nur fangen, dass hier.

Verwandte Themen