Python / win32com / try和除/检查应用程序是否正在运行

时间:2017-12-18 10:12:46

标签: python exception-handling win32com

我在Windows 7上使用python 3.6.2。

我有一个小功能,应该检查MS Excel是否已经运行。这个功能有点奇怪,在这里你的帮助将非常感激。

如果Excel正在运行,该函数应该检查。如果是,请打印文本并退出应用程序。如果不是,一切都很好,继续。

我现在的问题是,当Excel 运行时,执行try-block包括打印但不执行sys.exit() AND 执行except-block还有!? 如果Excel NOT 正在运行,那么一切正常,try-block中止,只执行except-block。

为什么在Excel运行时执行两个print语句?

请帮忙!

这是我的代码:

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()

我的输出(当Excel运行时):

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

提前致谢!

更新

好的,我已经理解,在没有指定我想要处理的异常的情况下,我通常不应该“除了”。但是我如何确定我要捕获的异常类型。如果我查看错误消息,我就不清楚了。

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)

再次感谢您的帮助,伙计们!

3 个答案:

答案 0 :(得分:0)

这是因为sys.exit()也会抛出异常。

答案 1 :(得分:0)

我相信你的问题是sys.exit()抛出异常。

Sys.exit()通过抛出系统退出异常退出。你不能把它放在那里,只是使用一般的catch all语句。

希望这有帮助!

答案 2 :(得分:0)

从sys.exit()上的python文档中,您可以看到问题所在:

  

这是通过引发SystemExit异常来实现的,因此可以接受try语句的finally子句指定的清理操作,并且可以拦截外层的退出尝试。

所以会发生的是sys.exit()正在执行并尝试通过抛出SystemExit异常来结束程序。但是因为你写了一个泛型,除了你捕获异常然后打印消息。

因此,您可以提供一个很好的示例,说明为什么编写泛型异常是一个坏主意,因为您最终可以捕获您不想捕获的异常。你应该寻找

的异常类型
win32com.client.GetActiveObject("Excel.Application")

投掷并且只能抓住这里。