Exception
Las excepciones son sólo un tipo especial de variante, "lanzadas" en casos excepcionales (¡no abusar de ellas!).
Uso
let getItem = (theList) =>
if (callSomeFunctionThatThrows()) {
/* retorna el item encontrado aquí */
} else {
raise(Not_found)
};
let result =
try (getItem([1, 2, 3])) {
| Not_found => 0 /* Valor pode defecto si getItem lanza una excepción */
};
Tenga en cuenta que lo anterior sólo tiene el propósito de demostración; en realidad, devolverías un option(int)
directamente desde getItem
y evitas el try
de una sola vez.
Directamente puedes hacer coincidir en las excepciones mientras obtienes otro valor devuelto por una función:
switch (List.find((i) => i === theItem, myItems)) {
| item => print_endline(item)
| exception Not_found => print_endline("¡Ese item no ha sido encontrado!")
};
También puedes hacer tus propias excepciones como harías una variante (las excepciones también necesitan ser escritas en mayúsculas).
exception InputClosed(string);
...
raise(InputClosed("el stream esta cerrado!"));
Consejos y trucos
Cuando tienes variantes normales, a menudo no necesitas excepciones. Por ejemplo, en vez de lanzar una excepción cuando no se encuentra item
en una colección, trate de devolver un option(item)
(None
en este caso) en su lugar.
Decisiones de Diseño
El consejo de arriba parece contradecir lo que está sucediendo en la biblioteca estándar de OCaml; funciones prominentes en módulos como List y String parece que lanzan excepciones demasiado a menudo. Esto es por una parte un legado histórico y por otra el cuidado extremo por el rendimiento. OCaml/Reason nativo es increíblemente eficaz; la generación de excepciones fue diseñada para tener un coste muy bajo, menor que asignar y devolver por ejemplo, una option
. Desafortunadamente este no es el caso de JavaScript.
Nuevas alternativas a la biblioteca estándar vienen normalmente con funciones que devuelven option
en vez de generar una excepción. Por ejemplo, List.find
tiene otra forma de devolver option
que es List.find_opt
, que no genera una excepción.
Las excepciones en realidad también son sólo variantes. De hecho, todos ellas pertenecen a un único tipo de variante, llamado exn
. Es una variante extensible, lo que significa que le puedes agregar nuevos constructores, como hemos hecho con InputClosed
mas arriba. exception Foo
es solo un endulzamiento sintáctico para añadir un constructor a exn
.