validar try tipos sirve que por para excepción excepciones archivos anidados python exception-handling

tipos - try except anidados python



Captura de una excepción al usar una declaración ''with'' de Python (4)

Para mi vergüenza, no puedo averiguar cómo manejar la excepción para python ''with''. Si tengo un código:

with open("a.txt") as f: print f.readlines()

Tengo muchas ganas de manejar ''archivo no encontrado excepción'' para hacer algo. Pero no puedo escribir

with open("a.txt") as f: print f.readlines() except: print ''oops''

y no puedo escribir

with open("a.txt") as f: print f.readlines() else: print ''oops''

encerrar ''con'' en una declaración de prueba / excepción no funciona: la excepción no se produce. ¿Qué puedo hacer para procesar el error dentro de la declaración ''with'' de forma Pythonic?


Captura de una excepción al usar una declaración ''with'' de Python

La instrucción with ha estado disponible sin la importación __future__ desde Python 2.6 . Puedes obtenerlo tan pronto como Python 2.5 (¡pero en este momento es el momento de actualizar!) Con:

from __future__ import with_statement

Aquí está lo más cercano a corregir que tienes. Ya casi estás ahí, pero with no tiene una cláusula de except :

with open("a.txt") as f: print(f.readlines()) except: # <- with doesn''t have an except clause. print(''oops'')

El método __exit__ de un administrador de __exit__ , si devuelve False volverá a generar el error cuando finalice. Si devuelve True , lo suprimirá. El __exit__ del __exit__ no devuelve True , por lo que solo necesita __exit__ en un try, excepto en el bloque:

try: with open("a.txt") as f: print(f.readlines()) except Exception as error: print(''oops'')

Y estándar estándar: no use un simple except: que BaseException y cualquier otra excepción y advertencia posible. Sea al menos tan específico como Exception , y para este error, quizás IOError . Solo captura errores que estés preparado para manejar.

Así que en este caso, harías:

>>> try: ... with open("a.txt") as f: ... print(f.readlines()) ... except IOError as error: ... print(''oops'') ... oops


La mejor manera "Pythonic" de hacer esto, explotando la declaración with , está listada como Ejemplo # 6 en PEP 343 , que proporciona el trasfondo de la declaración.

@contextmanager def opened_w_error(filename, mode="r"): try: f = open(filename, mode) except IOError, err: yield None, err else: try: yield f, None finally: f.close()

Utilizado de la siguiente manera:

with opened_w_error("/etc/passwd", "a") as (f, err): if err: print "IOError:", err else: f.write("guido::0:0::/:/bin/sh/n")


Otra alternativa podría ser verificar si el archivo existe primero y luego continuar with declaración. Ejemplo:

import os if not os.path.exists(file_path): # check first if file exsits print("file not found") else: with open("a.txt") as f: # proceed as usual print f.readlines()


from __future__ import with_statement try: with open( "a.txt" ) as f : print f.readlines() except EnvironmentError: # parent of IOError, OSError *and* WindowsError where available print ''oops''

Si desea una gestión diferente de los errores de la llamada abierta frente al código de trabajo, puede hacerlo:

try: f = open(''foo.txt'') except IOError: print(''error'') else: with f: print f.readlines()