You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 03:10:05