poner - try and catch in python
Usar la instrucción python "with" con el bloque try-except (4)
- Los dos bloques de código que diste no son equivalentes
- El código que describió como la forma antigua de hacer las cosas tiene un error grave: en caso de que la apertura del archivo falle, obtendrá una segunda excepción en la cláusula
finally
porquef
no está vinculado.
El código de estilo antiguo equivalente sería:
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
Como puede ver, la declaración with
puede hacer que las cosas sean menos propensas a errores. En las versiones más nuevas de Python (2.7, 3.1), también puede combinar múltiples expresiones en una with
instrucción. Por ejemplo:
with open("input", "r") as inp, open("output", "w") as out:
out.write(inp.read())
Además de eso, personalmente considero que es un mal hábito detectar cualquier excepción tan pronto como sea posible. Este no es el propósito de las excepciones. Si la función IO que puede fallar es parte de una operación más complicada, en la mayoría de los casos el IOError debe abortar toda la operación y, por lo tanto, debe manejarse en un nivel externo. Utilizando declaraciones, puedes deshacerte de todas estas declaraciones try...finally
en niveles internos.
¿Es esta la manera correcta de usar la instrucción python "with" en combinación con un bloque try-except ?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Si lo es, considerando la forma antigua de hacer las cosas:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
¿El principal beneficio de la declaración "con" aquí es que podemos deshacernos de tres líneas de código? No me parece convincente para este caso de uso (aunque entiendo que la declaración "con" tiene otros usos).
EDITAR: ¿Es idéntica la funcionalidad de los dos bloques de código anteriores?
EDIT2: Las primeras respuestas hablan en general sobre los beneficios de usar "con", pero aquéllas parecen tener un beneficio marginal. Todos hemos estado (o deberíamos haber estado) llamando explícitamente a f.close () durante años. Supongo que un beneficio es que los codificadores descuidados se beneficiarán del uso de "con".
Creo que te equivocaste al decir "con" que solo reduce las líneas. Realmente hace la inicialización y maneja el desmontaje.
En su caso, "con" no
- abrir un archivo,
- procesar sus contenidos, y
- asegúrate de cerrarlo
Aquí hay un enlace para entender la declaración "con": http://effbot.org/zone/python-with-statement.htm
Editar: Sí, su uso de "con" es correcto y la funcionalidad de ambos bloques de código es idéntica. Pregunta sobre por qué usar "con"? es por los beneficios que obtienes con eso. como mencionaste sobre la ausencia accidental de f.close ().
El camino más pitónico para los siguientes códigos es:
try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
try:
f = open("file", "r")
except IOError:
<whatever>
else:
f.close()
Si los contenidos del bloque finally
están determinados por las propiedades del objeto de archivo que se está abriendo, ¿por qué el ejecutante del objeto de archivo no debe escribir el bloque finally
? Ese es el beneficio de la declaración with
, mucho más que guardar tres líneas de código en esta instancia particular.
Y sí, la forma en que se ha combinado y lo ha try-except
es prácticamente la única forma de hacerlo, ya que los errores excepcionales causados dentro de la declaración open
no se pueden atrapar dentro del bloque with
.