Las excepciones son un concepto fundamental en programación que se refiere a los errores que pueden ocurrir durante la ejecución de un programa. A pesar de ser inevitables, las excepciones se pueden manejar de manera que el programa no "explote" o falle espectacularmente. En Python, y muchos otros lenguajes, se pueden utilizar estructuras específicas para tratar estos errores y asegurar que el programa continúe funcionando de manera eficiente.
¿Cómo se manejan las excepciones en Python?
Python proporciona una estructura clara para el manejo de excepciones mediante el uso de las palabras clave try, except, y finally. Aunque se diferencian en otros lenguajes como JavaScript, donde se usa try-catch, el concepto básico permanece: intentar una operación, capturar posibles errores y manejar el resultado.
¿Cómo implementar try y except?
Vamos a ver un ejemplo práctico para ilustrar cómo usar try y except en Python. Supongamos que queremos dividir elementos de una lista por un divisor. Un error común aquí puede ser la división por cero, lo cual queremos manejar.
Implementación básica de la función:
defdivide_elementos(lista, divisor):return[i / divisor for i in lista]
Para manejar la excepción de división por cero, podemos mejorar esta función con try y except:
defdivide_elementos(lista, divisor):try:return[i / divisor for i in lista]except ZeroDivisionError as e:print("Error:", e)return lista
En este código, try intenta dividir cada elemento de la lista por el divisor. Si ocurre un ZeroDivisionError, el flujo del programa se captura en except, donde imprimimos el error y devolvemos la lista original.
¿Por qué es importante manejar las excepciones?
Manejar las excepciones adecuadamente evita que el programa falle catastróficamente. En lugar de que el funcionamiento de la aplicación se interrumpa, podemos prevenir errores conocidos y proporcionar mensajes claros a los desarrolladores o usuarios sobre qué salió mal.
¿Cuáles son las mejores prácticas al manejar excepciones?
Manejar errores de manera explícita: Es fundamental especificar el tipo de excepción que queremos manejar, como ZeroDivisionError, para tener un control preciso sobre los errores.
No silenciar excepciones: Simplemente imprimir el error en la consola sin tomar ninguna acción se considera una mala práctica porque no detiene la fuente del problema.
Recolectar el mensaje de error: Utilizar variables como e en except para guardar y analizar el mensaje que proporciona Python puede ser útil para el diagnóstico de problemas.
Con este conocimiento, puedes asegurar que tu código es robusto frente a errores comunes, como realizar una incorrecta operación matemática, y continuar ejecutando las tareas esperadas.
Excepciones comunes:
ImportError : una importación falla;
IndexError : una lista se indexa con un número fuera de rango;
NameError : se usa una variable desconocida ;
SyntaxError : el código no se puede analizar correctamente
TypeError : se llama a una función en un valor de un tipo inapropiado;
ValueError : se llama a una función en un valor del tipo correcto, pero con un valor inapropiado
Pues sinceramente amigo no recuerdo de donde saqué todo eso (fue hace un mes), pero se que solo fueron como 4 paginas y de cada una saque pues esto y lo metí todo en este archivo (por cierto, excluí errores propios del sistema)
Lo que no me quedo claro es el uso del finally y el uso del keyword raise, por favor si alguien podría dejar un poco de código para experimentar con el.
Muchas gracias :D
De hecho, si quieres tener un poco de control con las excepciones en producción, siempre puedes manejar un archivo que sea una especie de log que lleve un registró de qué errores han sucedido y en dónde, también al manejar una excepción dentro de una función es bueno lanzar una alerta para que el usuario de la función sepa cual fue el error y pueda hacer algo al respecto ^^
Manejo de excepciones
Son muy comunes en la programación. No tienen nada de excepcional.
Las excepciones de Python normalmente se relacionan con errores de semántica.
Se pueden crear excepciones propias.
Cuando una excepción no se maneja (unhandled exception), el programa termina en error.
¿Cómo manejas las excepciones?
keywords: try, except, finally.
Se pueden utilizar también para ramificar programas.
No deben manejarse de manera silenciosa (por ejemplo con print statements)
Para aventar tu propia excepción utilizar el keyword raise.
if no sirve cuando el error produce una interrupción de la ejecución. Con try-except puedes capturar el error, mostrarlo como desees (o no mostrarlo) y permitir que el programa continúe.
De hecho, el error va desde el scope donde sucede, y si no es controlado, va al scope superior a el, y hace lo mismo. Hasta llegar al scope global, que en caso de no ser controlado romperá el programa y lanzara un error global.
Manejo de excepciones
Los manejos de excepciones son muy comunes en la programación, no tienen nada de excepcional. Las excepciones de Python normalmente se relacionan con errores de semántica, también podemos crear nuestras propias excepciones, pero cuando una excepción no se maneja (unhandled exception), el programa termina en error.
Las excepciones se manejan con los keywords: try, except, finally. Se pueden utilizar también para ramificar programas.
No deben manejarse de manera silenciosa (por ejemplo, con print statements). Para crear tu propia excepción utiliza el keyword raise.
"""Creamos una función en donde cada elemento de
una lista es dividida por un divisor definido"""
def divide_elementos_de_lista(lista, divisor):"""El programa intentara realizar la división"""try:return[i / divisor for i in lista]"""En caso de error de tipo ZeroDivisionError que
significa error al dividir en cero, el programa
ejecutara la siguiente instrucción"""
except ZeroDivisionErrorase:return lista
lista =list(range(10))divisor =0print(divide_elementos_de_lista(lista, divisor))
#All possible errors
except TypeError:print("is thrown when an operation or function is applied to an object of an inappropriate type.")except IndexError:print("is thrown when trying to access an item at an invalid index.")except KeyError:print("is thrown when a key is not found.")except ImportError:print("Raised when the imported module is not found.")except StopIteration:print("is thrown when the next() function goes beyond the iterator items.")except ValueError:print("is thrown when a function's argument is of an inappropriate type.")except NameError:print("is thrown when an object could not be found.")except ZeroDivisionError:print("is thrown when the second operator in the division is zero.")except KeyboardInterrupt:print("is thrown when the user hits the interrupt key (normally Control-C) during the execution of the program.")except MemoryError:print("Raised when an operation runs out of memory.")except FloatingPointError:print("Raised when a floating point operation fails.")except OverflowError:print("Raised when the result of an arithmetic operation is too large to be represented.")except ReferenceError:print("Raised when a weak reference proxy is used to access a garbage collected referent.")except TabError:print("Raised when the indentation consists of inconsistent tabs and spaces.")except SystemError:print("Raised when the interpreter detects internal error.")except RuntimeError:print("Raised when an error does not fall under any other category.")except:print("Error detected can't be handled nor clasified.")
Lo hice con la raíz cuadrada.Aprendí a traer la función que hace esa operación
import math
def raiz_cuadrada_elementos_lista(lista, multiplicador):try:return[math.sqrt(i*multiplicador)for i in lista] except ValueErrorase:print(e)return f'no existe la raíz cuadrada de un negativo'lista =list(range(10))multiplicador =-8print(raiz_cuadrada_elementos_lista(lista, multiplicador))```
¡Información adicional!
Funcionamiento de try
El bloque de código del try es ejecutado.
Si no ocurre una excepción, el except se pasa por alto y el try se termina.
Si ocurre una excepción durante el bloque de código del try, dejará de correr ese bloque y pasará el except. Si existe un match entre la excepción ocurrida y la declarada en except, el bloque del except es ejecutado. Luego sigue la ejecución común del programa.
Si no hay match, se deriva a un try integrado. Si no existe manejador de esta excepción, el programa se detendrá porque se trata de una unhandled expression mostrando el mensaje del error.
Varias excepciones en un except
Los except pueden recibir varias excepciones en forma de tupla, por ejemplo:
La sentencia try acepta un else que se usará cuando se deba ejecutar código si el try no encuentra ninguna excepción:
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()
Hola clayton
El finally, se usa de ultimo, "finalmente" despues de todo sin importar si hay error (que me lo salto con except) haz esto
try: x+1>20except:print("Hay un error")else:print("Todo perfecto")finally:print("El try finalizó")
En este caso si X no existe, el codigo te dará error por lo cual imprime "Hay un error" y finalmente(Finally) te imprime "El try finalizó"
Si el X existe, es decir x= 5 antes del try, sin importar si es correcta la afirmación o no, te va a decir "Todo perfecto" y finalmente(Finally) te imprime "El try finalizó"
Vamos con el raise
Así como Python te levanta errores si escribes mal y te para la ejecución, tu puedes crear o levantar un error (rise) a proposito y detener la ejecución
x =5if x <20: raise Exception("El numero es menor a 20!!")
En este caso, 5 es menor a 20, al cumplirse esta condición levantamos un error y en la terminal te va a detener la ejecución y te dirá Exception("El numero es menor a 20!!")
Es muy util cuando tienes una ejecución super larga y necesitas que salga bien, si no cumple las condiciones pues saldra el error y no pierdes tiempo
Espero estas explicaciones te ayuden, son ejemplos bastante sencillos, pero te puedes poner más creativo con tus habilidades
Saludos
++Explicación de la clase en código++
"""Excepciones:• Son muy comunes en programación.No tienen nada de excepcional.•Las excepciones de Python normalmente son errores de semántica.•Se pueden crear excepciones propias.•Cuando una excepción no se maneja(unhandled exception / excepción no controlada ), el programa termina en error.•Las excepcione se manejan con palabras reservadas:try, except,finally.•Se pueden utilizar para ramificar programas, crear condicionales.•No se debe manejar las excepciones con prints por consola, solamente.•Para crear una excepción se utiliza la palabra reservada "raise"."""
"""ExcepcionesComunes:• ImportError: una importación falla.•IndexError: una lista se indexa con un número fuera de rango.•NameError: se usa una variable desconocida.•SyntaxError: el código no se puede analizar correctamente.•TypeError: se llama a una función en un valor de un tipo inapropiado.•ValueError: se llama a una función en un valor del tipo correcto, pero con un valor inapropiado
"""
#PROGRAMACOMOEJEMPLODEEXPECIONES"""Creamos una función en donde cada elemento de
una lista es dividida por un divisor definido"""
def divide_elementos_de_lista(lista, divisor):try: #Se refiere a con lo que vamos a tratar.return[i / divisor for i in lista] except ZeroDivisionErrorase:"""En la excepción de que ocurra un error de querer dividir por 0, entonces
devuelve la lista.Except ayuda a que el programa no se caiga a pesar de
que ocurrió un error."""
print(e)return lista
finally:print('El try (tratamiento) ya terminó.')"""finally se utiliza cuando el try(tratamiento) terminó, sin importar
si hay un error o no."""
lista =list(range(10))divisor =0print(divide_elementos_de_lista(lista, divisor))print("""
Vamos con otro ejemplo, ahora usando la keyword 'raise':""")numero =4objetivo =9if numero < objetivo: raise Exception(f'¡{numero} es menor a {objetivo}!')