From 11e2f49ff72ae1f2977a8c8c2fc1b38efca25944 Mon Sep 17 00:00:00 2001 From: Ekaitz Zarraga Date: Thu, 21 Nov 2019 15:53:40 +0100 Subject: WIP: Add exceptions to structure --- src/03_estructura.md | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'src/03_estructura.md') diff --git a/src/03_estructura.md b/src/03_estructura.md index caadfb9..705f4a7 100644 --- a/src/03_estructura.md +++ b/src/03_estructura.md @@ -252,7 +252,75 @@ proceso que dejamos para el futuro. ### Excepciones -TODO +Las excepciones o *exception* son errores del programa, python lanza +excepciones cuando hay problemas. Por ejemplo, cuando intentas acceder a un +índice inexistente en una lista. + +Las excepciones terminan la ejecución del programa a no ser que se gestionen. +Se consideran fallos de los que el programa no puede arreglarse a no ser que se +le indique cómo. Algunas funciones y librerías lanzan excepciones que nosotros +debemos gestionar, por ejemplo: que un archivo no exista, o que no se tenga +permisos de edición en el directorio, etc. Es nuestra responsabilidad como +programadores tener un plan be o aceptar la excepción deportivamente a +sabiendas que nuestro programa terminará indicando un error. + +Hay ocasiones en las que las excepciones pueden capturarse y otras no, por +ejemplo, los fallos de sintaxis no pueden solventarse. + +Las excepciones se capturan en con un `try-except` que, si programas en otros +lenguajes como Java probablemente conozcas como `try-catch`. + +```python +try: + # Bloque donde pueden ocurrir excepciones. +except tipo1: + # Bloque a ejecutar en caso de que se dé una excepción de tipo1. + # Especificar el tipo también es opcional, si no se añade captura todos. +except tipoN: + # Bloques adicionales (opcionales) a ejecutar en caso de que se dé una + # excepción de tipoN, que no haya sido capturada por los bloques + # anteriores. +finally: + # Bloque (opcional) a ejecutar después de lo anterior, haya o no haya + # habido excepción. +``` + +Además de capturarse, las excepciones pueden lanzarse con la sentencia `raise`. + +``` python +if not input: + raise ValueError("Not valid input") +``` + +Si el ejemplo anterior se diera dentro de una pieza de código que no podemos +controlar, podríamos capturar el `ValueError` y evitar que la ejecución de +nuestro programa terminara. + +``` python +try: + # Bloque que puede lanzar un ValueError +except ValueError: + print("Not value in input, using default") + input = None +``` + +Aunque aún no hemos entrado en la programación orientada a objetos, te adelanto +que las excepciones se controlan como tal. Hay excepciones que serán hijas de +otras, por lo que usando la excepción genérica de la familia seremos capaces de +capturarlas, o podremos crear nuevas excepciones como hijas de las que python +ya dispone de serie. Por ahora recuerda que debes ordenar los bloques `except` +de más concreto a más genérico, porque si lo haces al revés, los primeros +bloques te capturarán todas las excepciones y los demás no tendrán ocasión de +capturar ninguna, perdiendo así el detalle de los fallos. + +Cuando aprendas sobre programación orientada a objetos en el apartado +correspondiente puedes volver a visitar este punto y leer la documentación de +python[^exception] para entender cómo hacerlo. Te adelanto que python tiene una +larga lista de excepciones y que está considerado una mala práctica crear +nuevas si las excepciones por defecto cubren un caso similar al que se +encuentra en nuestro programa. + +[^exception]: ### Funciones -- cgit v1.2.3