Estoy creando un programa que te permite lanzar aplicaciones desde Python. Lo había diseñado para que, si no se descargaba un determinado navegador web, se utilizaría otro de forma predeterminada. Desafortunadamente, el bloque try parece funcionar solo con un "excepto FileNotFoundError". ¿Hay alguna forma de tener varios de estos en el mismo bloque de prueba? Aquí está mi código (fallido) a continuación:

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

Si el usuario no ha descargado Google Chrome, el programa intenta iniciar Mozilla Firefox. Si no se encuentra esa aplicación, debería abrir Microsoft Edge; en su lugar, genera este error en IDLE (tenga en cuenta que he escrito mal chrome.exe y firefox.exe a propósito para simular los programas que esencialmente no existen):

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'

¿Hay alguna forma de generar dos de las mismas excepciones en un solo bloque try?

0
abr 6 ago. 2020 a las 21:16

2 respuestas

La mejor respuesta

Para su caso exacto, sugeriría esto:

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! :(")

Alternativa genérica con funciones:

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

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

Alternativa genérica con try / except anidado:

try: 
    do_something()
except Exception as e: 
    try: 
        do_something_else()
    except Exception as e:
        do_something_better()
0
gbarnett 6 ago. 2020 a las 18:34
for exe in ['chrome.exe','firefox.exe','msedge.exe']:
    try:
        os.startfile(exe)
        break

    except FileNotFoundError:
        print(exe,"error")
1
subhanshu kumar 6 ago. 2020 a las 18:35