¿Cuál es el uso previsto de la cláusula opcional "else" de la declaración "try" en Python?
¿ Cuál es el uso previsto de la else
cláusula opcional de la try
declaración?
Las declaraciones en el else
bloque se ejecutan si la ejecución cae desde el final del try
bloque, si no hubo excepción. Honestamente, nunca encontré una necesidad.
Sin embargo, el Manejo de excepciones señala:
El uso de la cláusula else es mejor que agregar código adicional a la cláusula try porque evita detectar accidentalmente una excepción que no fue generada por el código protegido por la declaración try...except.
Entonces, si tiene un método que podría, por ejemplo, lanzar un IOError
, y desea detectar las excepciones que genera, pero hay algo más que desea hacer si la primera operación tiene éxito y no desea detectar un IOError de esa operación, podrías escribir algo como esto:
try:
operation_that_can_throw_ioerror()
except IOError:
handle_the_exception_somehow()
else:
# we don't want to catch the IOError if it's raised
another_operation_that_can_throw_ioerror()
finally:
something_we_always_need_to_do()
Si simplemente lo pone another_operation_that_can_throw_ioerror()
después operation_that_can_throw_ioerror
, except
detectará los errores de la segunda llamada. Y si lo pones después de todo el try
bloque, siempre se ejecutará y no hasta después del finally
. El else
te permite asegurarte
- la segunda operación solo se ejecuta si no hay excepción,
- se ejecuta antes del
finally
bloque, y - Cualquier
IOError
cosa que surja no se captura aquí.
Hay una gran razón para usarlo else
: estilo y legibilidad. Generalmente es una buena idea mantener el código que puede causar excepciones cerca del código que las trata. Por ejemplo, compare estos:
try:
from EasyDialogs import AskPassword
# 20 other lines
getpass = AskPassword
except ImportError:
getpass = default_getpass
y
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
else:
# 20 other lines
getpass = AskPassword
El segundo es bueno cuando except
no se puede regresar antes o volver a lanzar la excepción. Si fuera posible, habría escrito:
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
return False # or throw Exception('something more descriptive')
# 20 other lines
getpass = AskPassword
Nota: Respuesta copiada de un duplicado publicado recientemente aquí , de ahí todo este asunto de "AskPassword".
Prueba con Python: otra cosa
¿ Cuál es el uso previsto de la
else
cláusula opcional de la declaración try?
El uso previsto es tener un contexto para ejecutar más código si no hubiera excepciones en las que se esperaba que se manejara.
Este contexto evita manejar accidentalmente errores que no esperaba.
Pero es importante comprender las condiciones precisas que hacen que se ejecute la cláusula else, porque return
, continue
y break
pueden interrumpir el flujo de control hacia else
.
En resumen
La declaración se ejecuta si noelse
hay excepciones y si no es interrumpida por una declaración , o .return
continue
break
Las otras respuestas omiten esa última parte.
De los documentos:
La
else
cláusula opcional se ejecuta siempre y cuando el control fluya desde el final de latry
cláusula.*
(Negrita agregada.) Y la nota al pie dice:
*Actualmente, el control “fluye desde el final” excepto en el caso de una excepción o la ejecución de una declaración
return
,continue
o .break
Requiere al menos una cláusula excepto anterior ( consulte la gramática ). Entonces, en realidad no es "intentar-de lo contrario", es "intentar-excepto-de lo contrario (-finalmente)", siendo else
(y finally
) opcional.
El tutorial de Python detalla el uso previsto:
La declaración try...except tiene una cláusula else opcional que, cuando está presente, debe seguir a todas las cláusulas except. Es útil para el código que debe ejecutarse si la cláusula try no genera una excepción. Por ejemplo:
for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()
El uso de la cláusula else es mejor que agregar código adicional a la cláusula try porque evita detectar accidentalmente una excepción que no fue generada por el código protegido por la declaración try...except.
Ejemplo de diferenciación else
versus código que sigue al try
bloque
Si maneja un error, el else
bloque no se ejecutará. Por ejemplo:
def handle_error():
try:
raise RuntimeError('oops!')
except RuntimeError as error:
print('handled a RuntimeError, no big deal.')
else:
print('if this prints, we had no error!') # won't print!
print('And now we have left the try block!') # will print!
Y ahora,
>>> handle_error()
handled a RuntimeError, no big deal.
And now we have left the try block!
Un uso: probar algún código que debería generar una excepción.
try:
this_should_raise_TypeError()
except TypeError:
pass
except:
assert False, "Raised the wrong exception type"
else:
assert False, "Didn't raise any exception"
(Este código debería resumirse en una prueba más genérica en la práctica).