¿Cuál es el uso previsto de la cláusula opcional "else" de la declaración "try" en Python?

Resuelto geowa4 asked hace 15 años • 22 respuestas

¿ Cuál es el uso previsto de la elsecláusula opcional de la trydeclaración?

geowa4 avatar May 13 '09 09:05 geowa4
Aceptado

Las declaraciones en el elsebloque se ejecutan si la ejecución cae desde el final del trybloque, 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, exceptdetectará los errores de la segunda llamada. Y si lo pones después de todo el trybloque, siempre se ejecutará y no hasta después del finally. El elsete permite asegurarte

  1. la segunda operación solo se ejecuta si no hay excepción,
  2. se ejecuta antes del finallybloque, y
  3. Cualquier IOErrorcosa que surja no se captura aquí.
Blair Conrad avatar May 13 '2009 02:05 Blair Conrad

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 exceptno 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".

Izkata avatar Jan 29 '2013 19:01 Izkata

Prueba con Python: otra cosa

¿ Cuál es el uso previsto de la elseclá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, continuey breakpueden 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 .returncontinuebreak

Las otras respuestas omiten esa última parte.

De los documentos:

La elsecláusula opcional se ejecuta siempre y cuando el control fluya desde el final de la tryclá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, continueo .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 elseversus código que sigue al trybloque

Si maneja un error, el elsebloque 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!
Russia Must Remove Putin avatar Feb 10 '2015 23:02 Russia Must Remove Putin

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

Darius Bacon avatar May 13 '2009 02:05 Darius Bacon