Python中try/except无法捕获pywintypes.error的问题解决
问题
为让Python代码以管理员权限重启,我写了这段代码:
import sys import os from win32comext.shell import shell asadmin = 'asadmin' if sys.argv[-1] != asadmin: script = os.path.abspath(sys.argv[0]) params = ' '.join([script] + sys.argv[1:] + [asadmin]) shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) sys.exit(0)
同意用户账户控制(UAC)提示时一切正常,但拒绝时控制台抛出:
pywintypes.error: (1223, 'ShellExecuteEx', 'The operation was canceled by the user.')
我尝试导入pywintypes捕获该异常,但没成功:
import ctypes import sys import os from win32comext.shell import shell from win32ctypes.pywin32 import pywintypes # Importing pertinent module try: if sys.argv[-1] != asadmin: script = os.path.abspath(sys.argv[0]) params = ' '.join([script] + sys.argv[1:] + [asadmin]) shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) sys.exit(0) except pywintypes.error: pass
Traceback信息如下:
Traceback (most recent call last): File "C:\Users\....myproject.py", line 13, in <module> shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) pywintypes.error: (1223, 'ShellExecuteEx', 'The operation was canceled by the user.')
不想用except Exception这种不良实践,请问异常捕获失败的原因是什么?该怎么修复?
原因分析
- 你导入的
pywintypes来自win32ctypes.pywin32模块,但shell.ShellExecuteEx抛出的异常属于pywin32原生的pywintypes类,两者不是同一个对象,因此无法匹配捕获。
修复方案
直接导入原生的pywintypes模块,修改后的代码如下:
import sys import os from win32comext.shell import shell import pywintypes # 直接导入原生pywintypes模块 asadmin = 'asadmin' try: if sys.argv[-1] != asadmin: script = os.path.abspath(sys.argv[0]) params = ' '.join([script] + sys.argv[1:] + [asadmin]) shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) sys.exit(0) except pywintypes.error as e: # 针对性处理用户取消授权的情况(错误码1223) if e.args[0] == 1223: print("用户取消了UAC授权") else: # 其他pywintypes错误可按需处理,或重新抛出 raise
补充说明
如果你的环境中需要通过win32api间接导入pywintypes,也可以使用以下写法,同样能正确捕获目标异常:
from win32api import pywintypes
内容的提问来源于stack exchange,提问作者Leonard Betts
相关产品推荐
相关产品推荐

