Introducci贸n

1

El Zen de Python

Conjuntos

2

Sets

3

Modificando conjuntos

4

Operaciones con conjuntos

5

Playgrounds: Elimina elementos duplicados usando conjuntos

Comprehensions

6

List Comprehension

7

Dictionary Comprehension

8

Dictionary Comprehension: condition

9

Playgrounds: Crea una lista usando List Comprehension

10

Lists vs. Tuples vs. Sets

Funciones

11

Funciones

12

Funciones: return

13

Par谩metros por defecto y m煤ltiples returns

14

El scope

15

Refactor game

16

Playgrounds: Tienda de Tecnolog铆a

17

Funciones an贸nimas: lambda

18

Higher order function: una funci贸n dentro de otra funci贸n

19

Map

20

Map con diccionarios

21

Reto: map con inmutabilidad

22

Playgrounds: Multiplica todos los elementos por dos

23

Filter

24

Playgrounds: Retorna solo palabras de 4 letras y m谩s

25

Reduce

M贸dulos

26

M贸dulos

27

Mis propios m贸dulos

28

M贸dulos como scripts: __name__ y __main__

29

Paquetes

30

Playgrounds: Calcular la suma de todas las compras

Manipulaci贸n de archivos y errores

31

Iterables

32

Errores en Python

33

Manejo de excepciones

34

Playgrounds: Captura la excepci贸n: ZeroDivisionError

35

Leer un archivo de texto

36

Escribir en un archivo

37

Leer un CSV

38

Playgrounds: Lee un CSV para calcular el total de gastos

Gr谩ficas en Python

39

Creando una gr谩fica

40

Reto: graficando la poblaci贸n de un pa铆s

41

Reto: graficando la poblaci贸n mundial

Pr贸ximos pasos

42

隆Conoce otros proyectos de este curso!

43

Reconoce tu proceso y certif铆cate

44

Toma el Curso de PIP y Entornos Virtuales con Python

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 鈥榯ry鈥 se ejecuta correctamente, es decir, sin excepciones.
.
El bloque finally se ejcuta haya o no excepciones en el bloque 鈥榯ry鈥, 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 鈥渆rror鈥.
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鈥檛 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鈥檇 still see the interpreter raise a SyntaxError.

(Sitio realpython)

You can only catch SyntaxError if it鈥檚 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 鈥渆xcept鈥 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 !