summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEkaitz Zarraga <ekaitz@elenq.tech>2019-11-21 15:53:40 +0100
committerEkaitz Zarraga <ekaitz@elenq.tech>2019-11-21 15:53:40 +0100
commit11e2f49ff72ae1f2977a8c8c2fc1b38efca25944 (patch)
treee3d3d81d8ac634b93e39ba860d3c78b17e303a31
parent088f1af731165cbcbeab96d9d55cc66c764d5018 (diff)
WIP: Add exceptions to structure
-rw-r--r--src/03_estructura.md70
1 files changed, 69 insertions, 1 deletions
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]: <https://docs.python.org/3/library/exceptions.html>
### Funciones