Sentencias try...except anidadas en Python
La declaración try...except
se usa en Python para detectar excepciones o ejecutar algún código propenso a errores. Todos los lenguajes de programación tienen esta característica en estos días, pero en Python, se utiliza con estas palabras y está representado por palabras clave try...except
, respectivamente. Aparte de try...except
, otra palabra clave, a saber, finally
, también podría usarse junto con ellos.
Al igual que los bucles for
, estas declaraciones try
, catch
y finally
también se pueden anidar, y en este artículo hablaremos de ello.
Declaraciones try...except
anidadas en Python
Como se mencionó anteriormente, podemos anidar estas declaraciones de la misma manera que anidamos bucles for
. Consulte el siguiente código para ver un ejemplo.
a = {"a": 5, "b": 25, "c": 125}
try:
print(a["d"])
except KeyError:
try:
print("a:", a["a"])
except:
print("No value exists for keys 'a' and 'd'")
finally:
print("Nested finally")
finally:
print("Finally")
Producción :
a: 5
Nested finally
Finally
Como podemos ver, el programa anterior primero inicializa un diccionario con algunos pares clave-valor y luego intenta acceder al valor de la clave d
. Dado que no existe un par clave-valor, se genera una excepción KeyError
y la declaración except
la detecta. Luego, los intérpretes ejecutan el código bajo el bloque try
anidado. Dado que existe un valor para la tecla a
, se imprime en la consola y se ejecuta el código debajo de la instrucción anidada finally
. Por último, se ejecuta el código debajo de la declaración exterior finally
.
Esto significa que podemos poner las declaraciones try
, catch
y finally
debajo de cualquier declaración de try
, catch
y finally
. Entienda esto con un ejemplo. Escribiremos un código que tenga declaraciones try
, catch
y finally
y todas estas declaraciones también tienen declaraciones try
, catch
y finally
debajo de ellas.
a = {
"a": 5,
"b": 25,
"c": 125,
"e": 625,
"f": 3125,
}
try:
try:
print("d:", a["d"])
except:
print("a:", a["a"])
finally:
print("First nested finally")
except KeyError:
try:
print("b:", a["b"])
except:
print("No value exists for keys 'b' and 'd'")
finally:
print("Second nested finally")
finally:
try:
print("c:", a["c"])
except:
print("No value exists for key 'c'")
finally:
print("Third nested finally")
Producción :
a: 5
First nested finally
c: 125
Third nested finally
Como podemos ver, primero se ejecuta el bloque exterior try
. Como no se encuentra ningún valor para la clave d
, se ejecuta el código debajo de la instrucción anidada except
y la anidada finally
. Dado que el bloque exterior try
no obtuvo ninguna excepción durante la ejecución, se omite su bloque except
y se ejecuta el código debajo del bloque exterior finally
.
Incluso podemos llevar esto más lejos si queremos y crear n
niveles de declaraciones anidadas try
, catch
y finally
. Pero a medida que aumenta el número de niveles anidados, el flujo de control o el flujo de ejecución se vuelve un poco complicado e inmanejable. Se vuelve un desafío navegar a través de las sentencias try
, catch
y finally
.