Skip to content

9. Errores y excepciones

Image

JavaScript no tiene un sistema de gestión de excepciones muy sofisticado. Sin embargo, proporciona el [throw] statement, que permite señalar un error, así como la estructura try/catch/finally, que permite atrapar esos errores.

9.1. script [excep-01]

En el siguiente script, mostraremos la fecha actual en el formato [horas:minutos:segundos:milisegundos]. Para ello, utilizaremos una librería JavaScript llamada [moment.js]. La instalamos, como siempre, usando la [npm] herramienta:

Image

El código del script es el siguiente:


1. 'use strict';
2. 
3. // moment package
4. import moment from 'moment';
5. 
6. ...

Para entender cómo se escribe la [import] línea de la línea 4, podemos fijarnos en la definición del [moment] módulo:

Image

  • en [1-2], vamos a la definición del módulo;
  • en [3], tenemos un archivo TypeScript, no un archivo JavaScript. En tiempo de ejecución, este archivo TypeScript se compila en un archivo JavaScript antes de ser utilizado;
  • en [4], buscamos las [exportar] declaraciones (Ctrl-F);
  • en [5], la sentencia exporta el [momento] objeto. Esto se puede importar en ES6 de la siguiente manera:

import moment from 'moment';

Puede utilizar cualquier nombre para importar el [momento] objeto, por ejemplo:


import m from 'moment';

Volvamos al código del script:


1. 'use strict';
2. 
3. // moment package
4. import moment from 'moment';
5. 
6. // try / catch / finally structure
7. for (let i = 0; i < 10; i++) {
8.   // current date and time
9.   const now = Date.now();
10.   // Format the time to include milliseconds
11.   const time = moment(now).format("HH:mm:ss:SSS");
12.   // the milliseconds
13.   const milli = Number(time.substr(time.length - 3));
14.   // display
15.   console.log("--------------------Iteration # ", i, "at", time);
16.   try {
17.     // number varies depending on the current time
18.     const count = milli % 2;
19.     if (count === 0) {
20.       // display an error message
21.       throw "error";
22.     }
23.     // if we get here, it means there was no error
24.     console.log("No errors");
25.   } catch (error) {
26.     // if we get here, it means there was an error
27.     console.log("error1=", error);
28.   } finally {
29.     // executed in all cases, whether there is an error or not
30.     console.log("finally")
31.   }
32. }

Comentarios

  • línea 4: importar la [momento] biblioteca;
  • El script hace un bucle 10 veces (línea 7). En cada iteración del bucle, se recupera la hora actual en el formato [horas:minutos:segundos:milisegundos] (líneas 8-13);
  • si el número de milisegundos es par, se muestra un mensaje de error (líneas 19-22);
  • El objetivo aquí es entender cómo funciona try / catch / finally

Ejecución


1. [Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-01.js"
2. --------------------Iteration #0 at 17:57:04:440
3. error1= error
4. finally
5. --------------------Iteration #1 at 17:57:04:447
6. no error
7. finally
8. --------------------Iteration #2 at 17:57:04:448
9. error1 = error
10. finally
11. --------------------Iteration #3 at 17:57:04:448
12. error1 = error
13. finally
14. --------------------Iteration #4 at 17:57:04:448
15. error1 = error
16. finally
17. --------------------Iteration #5 at 17:57:04:448
18. error1 = error
19. finally
20. --------------------Iteration #6 at 17:57:04:448
21. error1 = error
22. finally
23. --------------------Iteration #7 at 17:57:04:448
24. error1 = error
25. finally
26. --------------------Iteration #8 at 17:57:04:449
27. no error
28. finally
29. --------------------Iteration #9 at 17:57:04:449
30. no error
31. finally

Podemos ver que la [finally] cláusula se ejecuta siempre, haya error o no.

9.2. script [excep-02]

Este script demuestra que la sentencia [throw] puede lanzar cualquier tipo de dato y que este dato es capturado completamente por la cláusula [catch] .


1. 'use strict';
2. 
3. // you can "throw" just about anything to signal an error
4. let i = 0;
5. console.log("--------------------test # ", i);
6. // throw a string
7. try {
8.   throw "error message";
9. } catch (error) {
10.   // An error occurred
11.   console.log("error=[", error, "], type=", typeof (error));
12. }
13. // increment an array
14. i++;
15. console.log("--------------------test # ", i);
16. try {
17.   throw [1, 2, 3]
18. } catch (error) {
19.   // An error occurred
20.   console.log("error=[", error, "], type=", typeof (error));
21. }
22. // cast a literal object
23. i++;
24. console.log("--------------------test # ", i);
25. try {
26.   throw { name: "Hercules", country: "Ancient Greece" }
27. } catch (error) {
28.   // An error occurred
29.   console.log("error=[", error, "], type=", typeof (error));
30. }
31. // throw an Error
32. i++;
33. console.log("--------------------test # ", i);
34. try {
35.   throw new Error("network connection error");
36. } catch (error) {
37.   // An error occurred
38.   console.log("error=[", error, "], type=", typeof (error));
39. }
40. // throw an Error object
41. i++;
42. console.log("--------------------test # ", i);
43. try {
44.   throw new Error("network connection error");
45. } catch (error) {
46.   // An error occurred - the message is in [error.message]
47.   console.log("error.message=[", error.message, "], type(error)=", typeof (error));
48. }

Comentarios

  • líneas 35, 44: [Error] es una clase JavaScript cuyo constructor acepta un mensaje de error como primer parámetro opcional. Este mensaje se puede recuperar de la [Error.message] propiedad (línea 47);
  • Hay otras clases además de [Error] que pueden señalar un error: [EvalError, InternalError, RangeError, ReferenceError, SyntaxError, TypeError, URIError);

Ejecución


1. [Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-02.js"
2. --------------------test #0
3. error=[ error message ], type= string
4. --------------------test #1
5. error = [ [ 1, 2, 3 ] ], type = object
6. --------------------test #2
7. error=[ { name: 'hercule', country: 'ancient greece' } ], type= object
8. --------------------test #3
9. error=[ Error: network connection error
10. at Object.<anonymous> (c:\Data\st-2019\dev\es6\javascript\exceptions\excep-02.js:35:9)
11. at Object.<anonymous> (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:251206)
12. at c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:245054
13. at Generator.next (<anonymous>)
14. at bl (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:245412)
15. at kl (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:247659)
16. at Object.u (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:287740)
17. at Object.o (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:287137)
18. at Object.<anonymous> (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:284879)
19. at Object.apply (c:\Temp\19-09-01\javascript\node_modules\esm\esm.js:1:199341) ], type= object
20. --------------------test #4
21. error.message=[ network connection error ], type(error)= object

9.3. script [excep-03]

Este script demuestra que, dentro de un [catch], se puede distinguir el tipo de [Error] instancia interceptada por el [catch]:


1. 'use strict';
2. 
3. // moment package
4. import moment from 'moment';
5. 
6. // distinguish the Error instance received in a [catch]
7. for (let i = 0; i < 10; i++) {
8.   // current date and time
9.   const now = Date.now();
10.   // format the time to include milliseconds
11.   const time = moment(now).format("HH:mm:ss:SSS");
12.   // the milliseconds
13.   const milli = Number(time.substr(time.length - 3));
14.   console.log("--------------------iteration # ", i);
15.   try {
16.     // number [0, 1, 2]
17.     const num = milli % 3;
18.     switch (number) {
19.       case 0:
20.         throw new ReferenceError("error 1");
21.       case 1:
22.         throw new RangeError("error 2");
23.       default:
24.         throw new EvalError("error 3");
25.     }
26.   } catch (error) {
27.     // An error occurred
28.     if (error instanceof ReferenceError) {
29.       console.log("ReferenceError:", error.message);
30.     } else {
31.       if (error instanceof RangeError) {
32.         console.log("RangeError:", error.message);
33.       }
34.       else {
35.         if (error instanceof EvalError) {
36.           console.log("EvalError:", error.message);
37.         }
38.       }
39.     }
40.   }
41. }

Ejecución


1. [Running] C:\myprograms\laragon-lite\bin\nodejs\node-v10\node.exe -r esm "c:\Data\st-2019\dev\es6\javascript\exceptions\excep-03.js"
2. --------------------Iteration #0
3. ReferenceError: error 1
4. --------------------Iteration #1
5. RangeError: error 2
6. --------------------Iteration #2
7. RangeError: error 2
8. --------------------Iteration #3
9. RangeError: error 2
10. --------------------iteration #4
11. RangeError: error 2
12. --------------------iteration #5
13. RangeError: error 2
14. --------------------iteration #6
15. EvalError: error 3
16. --------------------iteration #7
17. EvalError: error 3
18. --------------------iteration #8
19. EvalError: error 3
20. --------------------iteration #9
21. EvalError: error 3