No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Manejo de excepciones

33/44
Recursos

Aportes 28

Preguntas 9

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

o inicia sesión.

También hay sentencias en el manejod e errores como else y finally.

try:
    pass
except Exception as e:
    raise
else:
    pass
finally:
    pass

.
El bloque else se ejecuta cuando todo lo del bloque ‘try’ se ejecuta correctamente, es decir, sin excepciones.
.
El bloque finally se ejcuta haya o no excepciones en el bloque ‘try’, es decir, que su ejecución es obligatoria

A primera vista podemos pensar que lanzar Excepciones no sirve de nada si al final igual ahí mismo las vamos a rodear de un try-except. Pero es más util cuando estamos creando funciones en modulos que van a ser usadas por otros módulos, funciones que dependiendo del uso que se le de en una u otra parte del código del proyecto tienen que hacerse diferentes validaciones para ese “error”.
Generar excepciones OBLIGA al equipo a manejarlos porque sino, el proyecto no va a funcionar.

Pueden encontrar más de cómo personalizar y manejar las excepciones en la documentación de python

Recomiendo buscar también sobre propagación de excepciones

PRUEBA & ERROR
Cuando se nos presenta un error o una excepción como se le llama en python, el programa se detiene y presenta el error que se presento, pero si utilizamos la excepción try() podemos omitir ese error y continuar con el programa. Esto es de uso fundamental para que el programa no continue con su ejecución por el error y así evitar retrasos en la producción, también de su uso para determinar en los bloques de código si se nos presenta un error poder ser identificado de manera mas facil.

Para qué try sea efectivo podemos utilizar estas declaraciones:

Exception Description
try Permite probar un bloque de código en búsqueda de un error.
except Permite manejar el tipo de error en el bloque.
else Permite ejecutar el código cuando no hay ningún tipo de error en el bloque.
finally Permite ejecutar el código en el bloque, independiente en el resultado de los bloques de prueba y excepción

Las excepciones son errores que se disparan durante la ejecución de un programa. En Python podemos dejar que dichas excepciones detengan el programa o en caso contrario escribir un algoritmo para reaccionar a dicha situación.

  • Los ejemplos más comunes que podemos nombrar de excepciones:

  • Tratar de convertir a entero un string que no contiene valores numéricos.

  • Tratar de dividir por cero.

  • Abrir un archivo de texto inexistente o que se encuentra bloqueado por otra aplicación.

  • Conectar con un servidor de bases de datos que no se encuentra activo.

  • Acceder a subíndices de listas o tuplas inexistentes.

  • Llamada a un método o función inexistente.

  • Importar módulos que no existen.

La captura de excepciones nos permite crear programas mucho más robustos y tolerante a fallas que ocurren en escasas situaciones, pero en caso que se presenten disponemos de un algoritmo alternativo para reaccionar a dicha situación evitando que el programa finalice su ejecución.

Manejo de Excepciones

#---------- Manejo de errores --------------

# python detiene la ejecucion al detectar un error
print(1/0)
print('hola')
--> Error division by zero

# Para evitar que el programa se detenga podemos manejar 
# los errores cont try except
try:
  print(0/0)
  assert 1 != 1, 'Uno no es igual a uno'
except ZeroDivisionError as Error:
  print(Error)

print('hola')
--> division by zero
		hola

# assert tiene una funcionalidad que permite lanzar un mensaje
# si no se cumple la condicion
# detiene la ejecucion del programa
assert 1 != 1, 'Uno no es igual a uno'
print('hola nuevamente')
--> Error Uno no es igual a uno

#capturar el error de assert
try:
  assert 1 != 1, 'Uno no es igual a uno'
except AssertionError as error:
  print(error)

print('hola nuevamente')
--> Uno no es igual a uno
		hola nuevamente

# capturar los errores propios para que no detenga el programa
try:
  age = 10
  if age < 18:
    raise Exception('No se permiten menores de edad')
except Exception as error:
  print(error)

print('hola')
--> No se permiten menores de edad
		hola

# capturar varios errores en un mismo bloque
# al conseguir un error detiene el bloque try y continua con
# la ejecucion del programa
try:
  print(0/0)
  assert 1 != 1, 'Uno no es igual a uno'
  age = 10
  if age < 18:
    raise Exception('No se permiten menores de edad')
except ZeroDivisionError as Error:
  print(Error)  
except AssertionError as error:
  print(error)
except Exception as error:
  print(error)

print('hola 2')
--> division by zero
		hola 2

Quise capturar un SyntaxError y no pude. Busqué información en Internet y encontré estas explicaciones:

You can’t handle invalid syntax in Python like other exceptions. Even if you tried to wrap a try and except block around code with invalid syntax, you’d still see the interpreter raise a SyntaxError.

(Sitio realpython)

You can only catch SyntaxError if it’s thrown out of an eval, exec, or import operation.

...    eval('x === x')
... except SyntaxError:
...    print "You cannot do that"
... 
You cannot do that```

This is because, normally, the interpreter parses the entire file before executing any of it, so it detects the syntax >error before the try statement is executed. If you use eval or its friends to cause more code to be parsed during >the execution of the program, though, then you can catch it.

(StackOverFlow)

La sentencia assert en Python es una forma de verificar que una condición es cierta y, si no lo es, generar una excepción de AssertionError. La sentencia assert se utiliza a menudo para hacer afirmaciones de precondición y postcondición en el código.

La diferencia clave entre la sentencia assert y el manejo de excepciones es que assert es una herramienta para verificar condiciones en el código durante la fase de desarrollo, mientras que el manejo de excepciones es una herramienta para controlar los errores que pueden ocurrir en tiempo de ejecución.

def divide(a, b):
    assert b != 0, "Error: division by zero"
    return a / b

result = divide(10, 2)
print(result)

result = divide(10, 0)
print(result)

En este ejemplo, la función divide realiza una división entre dos números. Antes de realizar la división, se usa la sentencia assert para verificar que el segundo argumento no es cero. Si el segundo argumento es cero, se genera una excepción de AssertionError con un mensaje de error específico.

Cuando se llama a la función con 10 y 2, la división se realiza sin problemas y se muestra el resultado en la consola. Pero cuando se llama a la función con 10 y 0, la sentencia assert genera una excepción de AssertionError, lo que detiene la ejecución del programa y muestra un mensaje de error en la consola.
Preguntenle a ChatGPT cuando con entienden algo, es muy util

Hola!

Les comparto el código de la clase

# Manejo de excepciones
# https://www.w3schools.com/python/python_try_except.asp

'''
Cada que vez que Python encuentra errores, vamos a controlarlo y manejarlo para evitar que se detenga la operacion del programa
'''

'''
# Cualquier error que pase en este bloque, va a ser capturado y podemos manejarlo
try:
  print(0 / 0)
except ZeroDivisionError as error:
  print(error)

try:
  assert 1 != 1, "Uno no es igual que uno"
except AssertionError as error:
  print(error)

# Capturar una excepcion propia
try:
  age = 10
  if age < 18:
    raise Exception("No se permiten menores de edad")
except Exception as error:
  print(error)
'''
# Unificando el manejo de excepciones en un solo bloque
'''
Al unificar los errores en un solo bloque, este se ejecuta hasta que se de la primera excepcion, cuando eso sucede, sale del bloque y continúa ejecutando el resto del programa.
'''
try:
  print(0 / 0)
  assert 1 != 1, "Uno no es igual que uno"
  age = 10
  if age < 18:
    raise Exception("No se permiten menores de edad")
except ZeroDivisionError as error:
  print(error)
except AssertionError as error:
  print(error)
except Exception as error:
  print(error)
  
print("Hola")
print("Hola 2")

Les dejo la estructura completa de una estructura para manejo de excepciones:

try:
		num_two = "1"
    num_two = 2
    sum = num_one + num_two #this statement throws an exception
    print(f"Suma: {sum}")
except TypeError as type_exception:
    print("A TypeError has happend, error: ", type_exception)
except ValueError:
    print("A ValueError has happend")
except Exception as exception:
    print("An exception has happend, error: ", exception)
else:
    print("The code was runned well")
finally:
    print("This code will run en every time")

OJO:
De la manera que se maneja el bloque final de errores no funcionaria completamente, debido que al ejecutar el primer “except” saltaría continuar con su condición y no terminaría de ejecutar el resto del código, cosa que no queremos.

#Manejo de errores manual
def sum(a,b):
  if(a != int or b !=int):
    raise Exception("Erraste")
  else:
    return a + b

try:
  sum("a",3)
except Exception as e:
  print(e)


#Manejo con errores incorporados
def suma(a,b):
	return a + b

try:
	sum("b",3)
except TypeError as e:
	print(e)

El Playground de la clase 34 (la siguiente) no sirve 😦 me manda al inicio del curso.

guardando los errores en un archivo

age = 18
try:
    if age < 18:
        raise Exception('no cumple con la mayoria de edad')
    assert 1 != 1, 'uno es igual a uno'
    print(7/5)
except Exception as error:
    with open('texto.txt', mode='r+',  encoding='utf-8') as file:
        file.read()
        file.write(f'{error} == {time.asctime()} \n')

Me toco ver la clase 2 veces para entender bien que era lo que significaba cada uno

es muy confuso esta clase

Investigue y encontre que exite una opcion finally aqui un ejemplo

try:
    age = 10
    if age < 18:
      raise Exception('Eres muy pequeno')
except Exception as error:

    print("Error: división entre cero.", error)
finally:
    print("Fin del programa")

MANEJO DE EXCEPCIONES


👇🏻 "Te muestro unos ejemplos" 👇🏻


Capturando la excepción lanzada:

try:
    age = 10
    if age < 18:
        raise Exception('No se permiten menores de edad')
except Exception as error:
    print("Error:", str(error))

Definiendo una excepción personalizada:

class MenorEdadException(Exception):
    def __init__(self, mensaje="No se permiten menores de edad"):
        super().__init__(mensaje)

try:
    age = 10
    if age < 18:
        raise MenorEdadException()
except MenorEdadException as error:
    print("Error:", str(error))

Manejo específico de excepciones:

try:
    age = 10
    if age < 18:
        raise Exception('No se permiten menores de edad')
except ValueError:
    print("Error: El valor de edad es inválido.")
except Exception as error:
    print("Error:", str(error))

Aquí tienes un ejemplo básico que muestra el uso de los bloques try, except, else y finally:

try:
    # Código que puede generar una excepción
    resultado = numerador / denominador
except ZeroDivisionError:
    # Manejo específico para división entre cero
    print("Error: No se puede dividir entre cero.")
except Exception as e:
    # Manejo genérico para otras excepciones
    print("Error:", str(e))
else:
    # Código a ejecutar si no se produce ninguna excepción
    print("El resultado es:", resultado)
finally:
    # Código que se ejecuta siempre, independientemente de las excepciones
    print("Fin del programa")

Anotaciones

#  De este modo capturamos los errores sin detener la ejecucion
try:
  print(0/0)
except ZeroDivisionError as error:
  print(error)
  

# assert nos da un segundo parametro para agregar un mensaje de error propio si el codigo no cumple la prueba unitaria. y si lo combinamos con el try,expcept tmbn evitamos que pare la ejecucion del codigo.
try:
  assert 2 > 5, "Dos no es mayor a 5"
except AssertionError as error:
  print(error)

# En este ejemplo aplicamos el try para capturar el error que creamos con el raise e imprimirlo sin parar la ejecucion.

age = 10
try:
  if age < 18:
    raise Exception("No se permiten menores de edad") 
except Exception as error:
  print(error)
  
print("hola")

# Para capturar errores no es necesario hacer un try para cada uno de ellos, basta con usar un solo try, y agregar el numero de excepciones que necesitemos para capturar cada tipo de error de forma independiente.
try:
  print(0/0)
  assert 2 > 5, "Dos no es mayor a 5"
  if age < 18:
    raise Exception("No se permiten menores de edad")
    
except ZeroDivisionError as error:
  print(error)
except AssertionError as error:
  print(error)
except Exception as error:
  print(error)

Super. Ya me imaginé un módulo para los errores personalizados y tener mejor orden de ellos. Yo creo que el profe seguirá profundizando en esto. Igual la documentación es clara.

Es vital el manejo de excepciones ya que podrias almacenar los errores en logs dentro de una base de datos o archivos y asi ver un historial de donde a fallado y ayuda mucho a detectar de manera mas facil que puede estar pasando

try:
  print(resume)
  except NameError as error:
    print(error)
  
    assert 1 != 1, 'Uno no es igual que uno'
  except AssertionError as error:
    print(error)
    age = 10
    if age > 18:
      raise Exception('No se permiten menores de edad')
  except Exception as error:
    print(error)

print(3)

Este manejador que se plantea acá no funciona completamente.

Supongamos el siguiente código

try:
    x = 0/0
    assert 1 != 1
    print("nombre:"+nombre)
except ZeroDivisionError as error:
    print(error)
except AssertionError as error:
    print(error)
except NameError as error:
    print(error)

En este caso, encontramos 3 errores en el try; sin embargo solo se captura ZeroDivisionError, lo que necesariamente significa que se captura el error pero la ejecución no continua para llegar al siguiente error.

¿Alguna idea para lograrlo?

Usé try-except en la clase de iterables:

for i in range(1, 10):
  print(i)

my_iter = iter(range(1, 4))

try:
    print(my_iter)
    print(next(my_iter))
    print(next(my_iter))
    print(next(my_iter))
    print(next(my_iter))
except:
    print('la iteración alcanzó su límite')

print(1/3)

Resumen: Manejo de excepciones

  • Una excepción en Python es un evento inesperado que puede ocurrir durante la ejecución de un programa
  • Interrumpe su flujo normal.
  • El manejo de excepciones permite al programador controlar cómo se maneja este evento y evitar que el programa se detenga de manera abrupta.

vengo de javascript, y allí me parece mas fácil manejar los errores ya que no es necesario especificar el tipo de error

try:
    print(0/0)
except ZeroDivisionError as error:
    print(error)

try:
    assert 1!=1,"Uno no es igual a 1" #Si no ponemos mensaje, no saldra nada
except AssertionError as error:
    print(error) 

#assert 1!=1,"Uno no es igual a 1"
#Se produce la excepcion y lanza ese mensaje

try:
    edad=10
    if edad<18:
        raise Exception("No se permite menores de edad")
#Como no tiene nombre la excepcion creada, se captura como excepcion
#solamente
except Exception as error:
    print(error)
    
#Juntando todo en uno
try:
    print(0/0)
    assert 1!=1,"Uno no es igual a 1"
    edad=10
    if edad<18:
        raise Exception("No se permite menores de edad")

except ZeroDivisionError as error:
    print(error)
except AssertionError as error:
    print(error) 
except Exception as error:
    print(error)
#Si captura una excepcion el resto del try ya no lo ejecuta
print("Hola")

try:
  print(0/0)
  assert 1 != 1, 'Uno no es igual a uno'
  age = 10
  if age < 18:
    raise Exception('No se permite menores de edad')
except ZeroDivisionError as error:
  print(error)
except AssertionError as error:
  print(error)
except Exception as error:
  print(error)

print('Hola')
print('Hola 2')

Ahora ya se como utilizar el try-except !