Почему мой блок «попробуй/кроме» пропускает ошибку?

Я изучал, как перезапустить мой код 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)

В случае, когда я предоставляю привилегии во всплывающем окне Windows в контексте (например, «Хотите ли вы, чтобы это приложение вносило изменения в ваше устройство?»), все работает нормально, но когда я выбираю вариант не делать этого, вывод консоль выдает мне ошибку 'pywintypes.error: (1223, 'ShellExecuteEx', 'Операция была отменена пользователем.')', что имеет полный смысл.

Поэтому я попытался уловить эту ошибку, добавив блок try/Exception следующим образом:

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

В чем заключается возникшая ошибка? возможно pywintypes.error не предполагается его поймать.

Guy 09.07.2024 08:35

@Guy Добавлен полный отслеживание.

Leonard Betts 09.07.2024 08:39

Но какой смысл в except: pass? Вы просто пытаетесь избежать обратной трассировки? Вероятно, ваш код должен каким-то образом уведомить пользователя о том, что действие не может быть выполнено.

tripleee 09.07.2024 09:27

@tripleee Блок кода, представленный в вопросе, является частью моего проекта, где я заменил имя ошибки на «Исключение». Само по себе это работает, но я считаю, что использование общих утверждений — плохая практика, и я действительно хочу выяснить, почему это не работает.

Leonard Betts 09.07.2024 09:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Скорее всего, вы используете неправильный импорт.

Попробуйте импортировать его напрямую, например

import pywintypes

Ух ты, это было так просто... Я пытался сделать это раньше, но PyCharm это не понравилось («Невозможно найти ссылку на «ошибку» в «pywintypes.py»), поэтому по какой-то причине я даже не запускал программу. . Большое спасибо, чувак!

Leonard Betts 09.07.2024 09:41

@LeonardBetts, добро пожаловать!

Coding Enthusiast 09.07.2024 09:51

Другие вопросы по теме