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