30. Excepciones

Versión para imprimir.

En esta lección se presenta el concepto de excepciones y como procesarlas.

A. throw

Cuando una instrucción no puede completarse por algún error, debe abortar usando la instrucción
throw new Error(mensaje)

A este proceso se le llama Lanzar una excepción.

Diagrama de throw.

Ejemplo

console.log("La instrución")
throw new Error(
 "throw aborta el programa")
console.log("Estas líneas")
console.log("no se ejecutan")

Salida

La instrución

Error: throw aborta el programa

Los errores generados por la instrucción throw pueden procesarse de varias formas que se verán a continuación.

B. try-catch

Diagrama de try-catch.
Diagrama de try-catch con error.

Ejemplo

try {
 console.log("Ejecuta bien")
} catch (e) {
 console.log("Esto no se hace")
}
console.log("Continúa normal")
try {
 console.log("Intenta seguir")
 throw new Error("Fallo")
 console.log("Esto no se hace")
} catch (e) {
 console.log(
  "Procesa el error:", e.message)
}
console.log("Adios")

Salida

Ejecuta bien
Continúa normal
Intenta seguir
Procesa el error: Fallo
Adios

C. try-finally

Diagrama de try-finally.
Diagrama de try-finally con error.

Ejemplo

try {
 console.log("Sin error")
} finally {
 console.log("Si se ejecuta")
}
console.log("Continua sin falla")
try {
 throw new Error("A volar")
 console.log("No se ejecuta.")
} finally {
 console.log("Ejecuta con error")
}
console.log("Esto no se realiza")

Salida

Sin error
Si se ejecuta
Continua sin falla
Ejecuta con error

Error: A volar

D. try-catch-finally

Diagrama de try-catch-finally.
Diagrama de try-catch-finally con error.

Ejemplo

try {
 throw new Error("Ouch")
} catch (e) {
 console.
  log("Restablece", e.message)
} finally {
 console.log("finally se ejecuta")
}
console.log("Esto se realiza")
try {
 console.log("Try exitoso.")
} catch (e) {
 console.log("catch no se hace")
} finally {
 console.log("finally se hace")
}
console.log("Esto se hace")

Salida

Restablece Ouch
finally se ejecuta
Esto se realiza
Try exitoso.
finally se hace
Esto se hace

E. try anidado

try {
 console.log("Empezamos")
 fallo()
 console.log("No me ignores")
} catch (e) {
 console.log(e.message)
}
console.log("Terminamos")
function fallo() {
 console.log("¿Fallaremos?")
 throw new Error("Fallamos")
 console.log("Tampoco me ignores")
}

Salida

Empezamos
¿Fallaremos?
Fallamos
Terminamos

Depúralo en GilPG Nod.

F. Formulario con excepciones

let dividendo = NaN
let divisor = NaN
try {
 leeDividendo()
 leeDivisor()
 valida()
 const resultado = procesa()
 console.log(
  "El resultado es:", resultado)
} catch (e) {
 console.error(e)
}

function leeDividendo() {
 const strDividendo = question(
  "Introduce el dividendo: ")
 dividendo =
  strDividendo === null ?
   NaN : parseFloat(strDividendo)
}

function leeDivisor() {
 const strDivisor = question(
  "Introduce el divisor: ")
 divisor = strDivisor === null ?
  NaN : parseFloat(strDivisor)
}

function valida() {
 /* Debe cumplirse que el dividendo
  * sea un número. */
 if (isNaN(dividendo))
  throw new Error(
   "El dividendo debe ser número.")
 /* Debe cumplirse que el divisor
  * sea un número. */
 if (isNaN(divisor))
  throw new Error(
   "El divisor debe ser número.")
 /* Debe cumplirse que el divisor
  * sea diferente de 0. */
 if (divisor === 0)
  throw new Error(
   "El divisor no puede ser 0.")
}

function procesa() {
 return dividendo / divisor
}

Depúralo en JavaScript Tutor.

G. Resumen