try example custom python python-3.x filenotfoundexception ioerror

example - typeerror python



Python "open()" arroja diferentes errores para "archivo no encontrado": ¿cómo manejar ambas excepciones? (4)

Tengo un script donde se le pide a un usuario que escriba un nombre de archivo (de un archivo que se abrirá), y si el archivo no existe en el directorio actual, se le solicita al usuario nuevamente. Aquí está la versión corta:

file = input("Type filename: ") ... try: fileContent = open(filename, "r") ... except FileNotFoundError: ...

Cuando probé mi script en mi MacOS X en Python 3.3x funcionó perfectamente bien cuando escribí el nombre de archivo incorrecto a propósito (ejecuta el paquete bajo "esperar").

Sin embargo, cuando quería ejecutar mi código en una computadora con Windows en Python 3.2x, recibo un error que dice que "FileNotFoundError" no está definido. Entonces, Python 3.2 en Windows piensa que "FileNotFoundError" es una variable y los programas se cierran con un error.

Descubrí que Python 3.2 en Windows arroja un "IOError" si el nombre de archivo de entrada no es válido. Lo probé en mi máquina Linux en Python 2.7, y también es un IOError.

Mi problema ahora es que el código con

except "FileNotFoundError":

no se ejecutará en Python 3.2 de Windows, pero si lo cambio a

except "IOError":

ya no funcionará en mi Mac.

¿Cómo podría solucionarlo? La única forma en que puedo pensar es usar solo except , lo que generalmente no quiero.


En 3.3, IOError convirtió en un alias para OSError , y FileNotFoundError es una subclase de OSError . Entonces podrías probar

except (OSError, IOError) as e: ...

Esto arrojará una red bastante amplia, y no puede suponer que la excepción es "archivo no encontrado" sin inspeccionar e.errno , pero puede cubrir su caso de uso.

PEP 3151 analiza las razones del cambio en los detalles.


Esto me parece mejor que un simple, except: pero no estoy seguro de si es la mejor solución:

error_to_catch = getattr(__builtins__,''FileNotFoundError'', IOError) try: f = open(''.....'') except error_to_catch: print(''!'')


Para capturar exactamente solo cuando no se encuentra un archivo, lo hago:

import errno try: open(filename, ''r'') except (OSError, IOError) as e: # FileNotFoundError does not exist on Python < 3.3 if getattr(e, ''errno'', 0) == errno.ENOENT: ... # file not found raise


puedes atrapar 2 errores al mismo tiempo

except (FileNotFoundError, IOError):

No me di cuenta de que eso es lo que estabas preguntando. Espero que haya una solución más elocuente que inspeccionar manualmente

try: error_to_catch = FileNotFoundError except NameError: error_to_catch = IOError

except error_to_catch

cwallenpoole hace este condicional de forma más elocuente en su respuesta (error_to_catch = getattr(__builtins__,''FileNotFoundError'', IOError))