Как вызвать несколько исключений одной и той же ошибки в одном блоке "Попробовать" - PullRequest
0 голосов
/ 06 августа 2020

Я создаю программу, которая позволяет запускать приложения с Python. Я спроектировал его таким образом, чтобы, если определенный веб-браузер не был загружен, по умолчанию использовался другой. К сожалению, кажется, что блок try работает только с одним «кроме FileNotFoundError». Есть ли способ иметь несколько из них в одном блоке try? Вот мой (неудачный) код ниже:

app = input("\nWelcome to AppLauncher. You can launch your web browser by typing '1', your File Explorer by typing '2', or quit the program by typing '3': ")
    if app == "1":
        try:
            os.startfile('chrome.exe')
        except FileNotFoundError:
            os.startfile('firefox.exe')
        except FileNotFoundError:
            os.startfile('msedge.exe')

Если у пользователя не загружен Google Chrome, программа пытается запустить Mozilla Firefox. Если это приложение не найдено, оно должно открыть Microsoft Edge; вместо этого возникает эта ошибка в IDLE (обратите внимание, что я намеренно ошибся в написании chrome .exe и firefox .exe, чтобы имитировать программы, которые по существу не существуют):

Traceback (most recent call last):
  File "C:/Users/NoName/AppData/Local/Programs/Python/Python38-32/applaunchermodule.py", line 7, in <module>
    os.startfile('chome.exe')
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'chome.exe'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/NoName/AppData/Local/Programs/Python/Python38-32/applaunchermodule.py", line 9, in <module>
    os.startfile('frefox.exe')
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'frefox.exe'

Есть ли способ вызвать два одинаковых исключения в одном блоке попытки?

Ответы [ 2 ]

1 голос
/ 06 августа 2020
for exe in ['chrome.exe','firefox.exe','msedge.exe']:
    try:
        os.startfile(exe)
        break

    except FileNotFoundError:
        print(exe,"error")
0 голосов
/ 06 августа 2020

Для вашего конкретного случая я бы предложил следующее:

priority_apps = ['chrome.exe', 'firefox.exe', 'msedge.exe']  # attempts to open in priority order
current_priority = 0
opened_app = False
while not opened_app and current_priority < len(priority_apps):
    try: 
        os.startfile(priority_apps[current_priority])
        opened_app = True
    except Exception as e:
        current_priority += 1
if not opened_app:
    print("couldn't open anything! :(")

generi c альтернатива с функциями:

try:
    do_something()
except Exception as e:
    do_something_else1()

def do_something_else1():
    try:
        do_something()
    except Exception as e:
        do_something_else2()

generi c альтернатива с вложенным try / except:

try: 
    do_something()
except Exception as e: 
    try: 
        do_something_else()
    except Exception as e:
        do_something_better()
...