<jupyter_start><jupyter_text>Excepciones en PythonEl código (sentencias) se escribe para que un dispositivo progamable **haga algo** en **determinadas condiciones**, cuando esas condiciones no se cumplen ocurren situaciones inesperadas y extrañas, situaciones exepcionales que impiden que el código continúe ejecutándose, para ello Python facilita sentencias que permiten manejar las exepciones. El siguiente código permite **atrapar la exepción** que ocurre cuando se pretende convertir a entero una cadena de caracteres vacía o que no contiene una expresión numérica válida.<jupyter_code># estructura típica para "atrapar" excepciones

try :
    value = int(input("Ingrese un número: "))
except :
    print("Por favor ingrese un número válido ...")<jupyter_output><empty_output><jupyter_text>Para cumplir con el objetivo de ingresar un valor numérico el código debe estar en una estructura repetitiva.<jupyter_code># Estructura típica de validación de entradas

while True :
    """ Este código se ejecutará siempre """
    try :
        value = int(input("Ingrese un número: "))
        break
    except :
        print("Por favor ingrese un número válido ...")<jupyter_output><empty_output><jupyter_text>Tratamiento de excepcionesLa cláusula **except** atrapa cualquier excepción que pueda ocurrir; sin embargo es una buena práctica organizar el tratamiento de diferentes excepciones, para ello a continucación de la cláusula **except** es posible indicar uno o más identificadores de excepciones ya definidas en el lenguaje o especialmente defindas por el desarrollador; ver [Excepciones incorporadas](https://docs.python.org/es/3/library/exceptions.htmlconcrete-exceptions).Cuando se indican identificadores de excepciones para su tratamiento, la cláusla **except** sin indicar excepción alguna debe ser la última de manea que se pueda atrapar cualquier excepción que no esté considerada antes.<jupyter_code># Estructura típica para "atrapar" distintas excepciones

try :
    # hacer algo
    a = None
    # ...
    
except ValueError :
    print("Problemas con en el valor esperado ...")

except IOErrror :
    print("Problemas de entrada/salida ...")
    
except :
    print("Problema no identificado ...")

# ...<jupyter_output><empty_output><jupyter_text>Las acciones que deben ejecutarse para cada excepción incluso para las no identificadas dependen del contexto del proceso en el que se ejecuta el códigoEl **código de propósito general** no puede determinar el contexto del proceso de modo que deben implementar **mecanismos robustos** para tratar las excepciones que pueden ocurrir incluso para **lanzar o disparar sus propias excepciones**. ---En Python, la sentencia **try ... except** permite la cláusula **else** que se ejecuta solamente si no hubo excepciones.<jupyter_code>try :
    first_value = int(input("Ingrese el primer valor: "))
    second_value = int(input("Ingrese el segundo valor: "))
    result = first_value / second_value
except ValueError :
    print("Ingrese un valor válido")
except ZeroDivisionError :
    print("No es posible dividir en cero")
except :
    print("Algo no funciona")
else :
    print("Resultado de la división", result)<jupyter_output><empty_output><jupyter_text>Es posible "atrapar" la excepción en una variable para realizar acciones con la información que la excepción brinda.<jupyter_code>try :
    first_value = int(input("Ingrese el primer valor: "))
    second_value = int(input("Ingrese el segundo valor: "))
    result = first_value / second_value
except ValueError as ex :
    print("Ingrese un valor válido", type(ex), ex)
except ZeroDivisionError as ex :
    print("No es posible dividir en cero", type(ex), ex)
except Exception as ex :
    print("Algo no funciona", type(ex), ex)
else :
    print("Resultado de la división", result)<jupyter_output><empty_output><jupyter_text>En situaciones en las que el código debe **ejecutar un bloque de sentencias independientemente de si se atrapa y resuelve una excepción o no**, es posible utilizar la cláusula **finally**.<jupyter_code>try :
    first_value = int(input("Ingrese el primer valor: "))
    second_value = int(input("Ingrese el segundo valor: "))
    result = first_value / second_value
except ValueError as ex :
    print("Ingrese un valor válido", type(ex), ex)
except ZeroDivisionError as ex :
    print("No es posible dividir en cero", type(ex), ex)
except Exception as ex :
    print("Algo no funciona", type(ex), ex)
else :
    print("Resultado de la división", result)
finally :
    print("Esto se ejecuta SIEMPRE")<jupyter_output><empty_output><jupyter_text>En situaciones en las que el código detecta una situación "**extraña**" es posible **lanzar una excepción** de manera que tal situación sea **atrapada y resuelta en un nivel superior del código**.<jupyter_code>age = int(input("Ingrese la edad en años: "))
if age < 0 :
    raise ValueError(str(age) + " no es un valor de edad correcto ...")<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.08486192299939528, 'fraction_numerical': 0.00040314452731304173, 'mean_word_length': 4.803508771929825, 'pattern_counts': {'":': 0, '<': 30, '<?xml version=': 0, '>': 29, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '609723', 'license': 'CC0-1.0', 'n_tokens_mistral': 1594, 'n_tokens_neox': 1604, 'n_words': 562, 'path': 'Structured/Exceptions.ipynb', 'repo_name': 'jtentor/PyB2I', 'size': '4961'}