Cuando ocurre un error, JavaScript crea un objeto de error con dos propiedades: nombre y mensaje. Entonces se dice que JavaScript lanza una excepción.
Puedes lanzar excepciones (errores) usando la sentencia throw y manejarlas usando las sentencias try…catch.
Tabla de contenidos
Sentencia throw
trow permite personalizar un error, y puede o no ser usado junto con try y catch:
throw expresión; // ‘expresión’ es el valor personalizado que será lanzado.
throw «Error5»; // Tipo string
throw 17; // Tipo número
throw true; // Tipo booleano
throw {toString: function() { return «¡Error indefinido!»; } };
Podemos especificar un objeto cuando lanzamos una excepción. En este caso, manejaremos las propiedades del objeto desde el bloque catch.
/* Crea un tipo de objeto llamado ‘excepcionUsuario’ /
function excepcionUsuario(mensaje) {
this.mensaje = mensaje;
this.nombre = ‘excepcionUsuario’;
}
/ Convierte la excepción en una cadena, /
excepcionUsuario.prototype.aCadena = function() {
return this.nombre + ‘: ‘ + this.mensaje;
}
/ Crea una instancia del tipo de objeto y lánzala */
throw new excepcionUsuario(‘La cadena introducida no es una dirección de e-mail válida’);
Sentencia try…catch
La sentencia try … catch consiste en:
- Un bloque try, que contiene una o más instrucciones. Si una de estas no se ejecuta con éxito, se lanza una excepción que es manejada por el bloque catch. En caso contrario, catch se ignora.
- Ninguno o varios bloques catch, que especifican qué hacer si una excepción es lanzada en el bloque try, (o en una función llamada dentro del bloque try).
- El bloque finally, que se ejecuta inmediatamente después de try…catch, permite ejecutar código sea cual sea el resultado, y terminar de «pulir» el manejo del error.
Un error producido por el programador, consistente en escribir ‘akert’ en vez de ‘alert’:
<p id="ejemplo"></p> <script> try { akert("¡Bienvenido a javaScript!"); } catch(x) { /* puede usarse cualquier otro nombre en lugar de 'x' */ document.getElementById("ejemplo").innerHTML = x.message; } </script> /* Salida: 'akert is not defined' */
En el siguiente ejemplo,si el usuario introduce un número que no está en el rango entre el 1 y el 12 (lo que no sería un mes del año válido), una excepción será lanzada:
<p>Por favor, introduzca el número de un mes (1-12).</p> <input id="ejemplo" type="text"> /* Recoge el número entrado por el usuario */ <button type="button" onclick="validaMes()">Verifica la entrada</button> <p id="mensaje"></p> <script> function validaMes(mes) { /* Creación del array 'meses'. Se inserta 'null' en el primer elemento del array (el 0) , para que el mes de enero coincida con el índice de array 1, meses[1] = 'Ene';. También se podría haber solucionado restando: 'mes = mes - 1;' */ var meses = [null, 'Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']; if(meses[mes]) { return meses[mes]; } else { throw 'Mes no válido'; /* Lanza la excepción */ } } /* Final de la función validaMes() */ var mensaje, x; mensaje = document.getElementById("mensaje"); mensaje.innerHTML = ""; x = document.getElementById("ejemplo").value; /* Asigna a x el valor introducido por el usuario */ try { nombreMes = validaMes(x); /* Llama a la función validaMes(), la cual puede lanzar la excepción que se manejará con 'catch' */ } catch(y) { nombreMes = "desconocido"; mensaje.innerHTML = "Error: " + y; /* Alternativo: 'manejadorErrores(y);' Pasa el objeto de excepción a un manejador de errores */ } </script>
El bloque finally
El bloque finally contiene sentencias a ejecutar después de las sentencias try…catch. El bloque finally se ejecuta siempre: tanto si se lanza una excepción como si no, y aunque no exista un bloque catch que maneje la excepción.
Si el bloque finally retorna un valor, este valor se convierte en el valor de retorno de toda la sentencia try-catch-finally, independientemente de que hayan sentencian return en el bloque try o el bloque catch:
Sentencias try…catch anidadas
Es posible anidad una o más sentencias try…catch. Si una sentencia try…catch interna no tiene un bloque catch, pasa a verificarse la sentencia try…catch del bloque exterior.
Validación HTML
Generalmente se suele combinar validación JavaScript con HTML
<input id=»ejemplo» type=»number» min=»5″ max=»10″ step=»1″