Decimoseptima clase
19 de Octubre, 2020
Hicimos este ejercicio.
Introducción
Cuando ejecutamos un programa, pueden ocurrir problemas que hacen que éste no se comporte de la manera la cual nosotros esperábamos. En otras palabras, pueden ocurrir errores. ¿Qué deberíamos hacer ante un error?
Si nosotros ignoramos el error, se puede convertir en una bola de nieve y desencadenar en otros errores, que pueden ser peores . Por lo tanto, lo mejor que podemos hacer es fallar. Una forma de lograr esto es mediante el uso de excepciones.
Excepciones
Una excepción es una indicación de que algo salió mal en la ejecución nuestro programa.
¿Y cómo las podemos utilizar en Wollok? Hay dos maneras de hacerlo:
- Usando el mensaje
error
, el cual entienden los objetos y nos sirve para lanzar una excepción:
self.error("mensaje del error")
- Usando throw y la clase
Exception
:
throw new Exception(message = "mensaje del error")
También podemos crear nuestras propias excepciones . Para esto podemos crear una clase que herede de Exception
. Esto nos va a ser útil más adelante.:
class ExcepcionParticularDelPrograma inherits Exception {}
y la tiramos como antes:
throw new ExcepcionParticularDelPrograma(message = "mensaje del error")
Además, es importante que nuestros mensajes de excepción sean expresivos. Así si algo rompe sabremos por qué .
Ahora, todo bien, pero ¿para qué me sirven en la ejecución del programa? ¿Qué hacen?
class Rick{
method aumentarDemencia(unaCantidad) {
if (nivelDeDemencia + unaCantidad > 100)
throw new EstoyReDementeException()
nivelDeDemencia += unaCantidad // nunca será ejecutado si se entra al if anterior
}
}
Luego de tirar la excepción se corta la ejecución del programa. Además, decimos que las excepciones burbujean por lo que si otro objeto llamó a aumentarDemencia
de un Rick y ese método lanza la excepción, también cortará el flujo de ejecución para ese objeto.
Entonces, ¿si lanzamos una excepción esta subirá indefinidamente? Bueno, en realidad no, porque si esto pasara cada vez que se lanza una excepción terminaría nuestro programa. Así que ahora veremos una forma de manejar excepciones …
Atrapando Excepciones
Cuando sabemos qué hacer ante una excepción, tenemos la opción de atrapar la excepción y utilizar otro código que se tiene que ejecutar si ocurrió tal excepción.
En wollok, esto se realiza de la siguiente forma:
try {
// código que puede fallar
} catch e : ExcepcionQueQuieroAtrapar {
// código a ejecutar si ocurre ExcepcionQueQuieroAtrapar
}
Algo a notar, es que la excepción a atrapar tiene que ser la que quiero atrapar y lo menos general posible. Si atrapo, por ejemplo, Exception
, seguramente esté atrapando errores que no hubiese querido atrapar (Por ejemplo, división por cero).
Interfaz
Una interfaz es un contrato que cumplen dos o más clases u objetos la cual obliga a que estos cumplan con la implementación de un conjunto de métodos.
Cuando dos objetos o clases tienen una interfaz en común, es posible para un tercero utilizar sus instancias de forma polimórfica, aunque recordemos que el polimorfismo solo está si efectivamente un tercero interactua indistintamente.
Las interfaces nos sirven para explicitar lógica que debe ser cumplida para quienes las implementen. En algunos lenguajes, las interfaces se escriben en código y existen validaciones de compilación para asegurar su cumplimiento. En Wollok
no se escriben las interfaces en código, pero en la materia siempre vamos a explicitar las interfaces en el diagrama de clases.
¿Cuál es la diferencia entre una interfaz y una clase abstracta? Si bien son similares, la clase abstracta tiene como objetivo reutilizar comportamiento, ya que siempre la tenemos en código y la idea es que otras clases puedan heredar de la misma implementando sus métodos. En cambio, el concepto de la interfaz es demostrar partes comunes entre clases u objetos para que puedan ser utilizados polimórficamente.
En el diagrama de clases, la podemos ver indicada con una I, en este caso en el Familiar.
Tarea
- Mumuki: Lección 9
Links útiles
Y saber mas sobre nosotros acá