Errores de JavaScript: arreglar, procesar, reparar

Hola a todos! Inspirados por el éxito del artículo anterior, que se escribió antes del lanzamiento del curso " Fullstack JavaScript Developer ", decidimos continuar la serie de artículos para principiantes y todos aquellos que recién comienzan a participar en la programación en JavaScript. Hoy hablaremos sobre los errores que ocurren en JS, así como sobre cómo lidiar con ellos.



Cometa un error para una persona, y él estará agradecido por una solicitud de extracción. Enséñele a debutar solo y él le agradecerá todo el proyecto.

Timlid desconocido

Errores comunes para principiantes


Entonces, comencemos con los errores más primitivos. Supongamos que acaba de terminar de aprender los conceptos básicos de HTML y CSS y ahora se está embarcando activamente en la programación de JavaScript. Por ejemplo: cuando hace clic en un botón, por ejemplo, abre una ventana modal oculta hasta este momento. Además, desea que esta ventana se cierre haciendo clic en la cruz. Un ejemplo interactivo está disponible aquí (elegí bitbucket debido a que su interfaz me parece la más simple, y no es lo mismo sentarse en un github).

let modal_alert = document.querySelector(".modal_alert") let hero__btn = document.querySelector(".hero__btn") let modal_close = document.querySelector(".modal-close ") //   DOM   .  ,   bulma     //       - : hero__btn.addEventListener("click", function(){ modal_alert.classList.add("helper_visible"); }) modal_close.addEventListener("click", function(){ modal_alert.classList.remove("helper_visible"); }) //    ,    . ,    css- display:flex.  ,   . 

En nuestro index.html, además del diseño, insertamos nuestro script dentro de la etiqueta principal:
  <script src="code.js"></script> 


En index.html además del diseño dentro de la etiqueta principal, insertamos nuestro script :

  <script src="code.js"></script> 


Sin embargo, a pesar del hecho de que todos estamos conectados, nada funcionará y se producirá un error:



Lo cual es muy triste, los principiantes a menudo se pierden y no entienden qué hacer con las líneas rojas, como si esto fuera algún tipo de veredicto y no una pista sobre lo que está mal en su programa. addEventListener , el navegador nos dice que no puede leer la propiedad addEventListener de valor cero. Entonces, por alguna razón, no obtuvimos nuestro elemento del modelo DOM. ¿Qué algoritmo de acción se debe tomar?

Primero, mira en qué punto se llama javascript en ti. El navegador lee su código html de arriba a abajo, mientras lee, por ejemplo, un libro. Cuando vea la etiqueta del script , ejecutará inmediatamente su contenido y continuará leyendo los siguientes elementos, sin preocuparse realmente de que esté tratando de obtener elementos DOM en su script, pero aún no los ha leído y, por lo tanto, no ha creado un modelo.

¿Qué hacer en este caso? Simplemente agregue el atributo de defer dentro de su etiqueta (o async , pero no entraré en detalles de su trabajo ahora, se puede leer aquí ). O simplemente puede mover su etiqueta de script hacia abajo antes del body cierre, esto también funcionará.

En segundo lugar, verifique los errores tipográficos. Aprenda la metodología BEM (también es útil porque sabe cómo se escribe su elemento), escribe clases de acuerdo con la misma lógica e intenta usar solo el idioma inglés correcto. O copie el nombre del elemento directamente en el archivo JS.

Genial Ahora que ha corregido los errores, puede disfrutar de la versión funcional del código en la siguiente dirección .

Error misterioso

La mayoría de los recién llegados están confundidos por el extraño error de la última línea de código. Aquí hay un ejemplo:



Algo incomprensible se muestra en la consola. Traducido, es literalmente "Fin de entrada inesperado", ¿y qué hacer al respecto? Además, el recién llegado por costumbre mira el número de línea. Todo parece normal en ella. ¿Y por qué entonces la consola lo señala?

Todo es simple Para comprender cómo interpretar su programa, el intérprete JS necesita saber dónde termina el cuerpo de la función y dónde termina el cuerpo del bucle. En esta versión del código, olvidé absolutamente la última llave:

  //           let root = document.getElementById("root"); //    root let article__btn = document.querySelector("article__btn"); //       article__btn.onclick = () => { for (let i = 0; i < headers.length; i++) { root.insertAdjacentHTML("beforeend", ` <div class="content is-medium"> <h1>${headers[i]} </h1> <p>${paragraps[i]}</p> </div>`) //    .     } 


Ahora, JavaScript no comprende dónde tiene el final del cuerpo de la función y dónde el final del ciclo no puede interpretar el código.

¿Qué hacer en este caso? En cualquier editor de código moderno, si coloca el cursor delante del corchete de apertura, su opción de cierre se resalta (si el editor aún no ha comenzado a subrayar este error en rojo). Revise el código nuevamente cuidadosamente, teniendo en cuenta que no hay llaves solitarias en JS. Puede ver la versión problemática aquí , y la versión corregida, aquí .

Dividimos el código

Muy a menudo vale la pena escribir código, probando su trabajo en piezas pequeñas. O, como persona normal, aprenda TDD. Por ejemplo, necesita un programa simple que reciba información de un usuario, lo agregue a una matriz y luego muestre sus valores promedio:

  let input_number = prompt("  "); // ,       let numbers = []; function toArray(input_number){ for (let i = 0; i < input_number; i++) { let x = prompt(`  ${i}`); numbers.push(x); //      } } toArray(input_number); function toAverage(numbers){ let sum = 0; for (let i = 0; i < numbers.length; i++) { sum += numbers[i]; } return sum/numbers.length; } alert(toAverage(numbers)); 


A primera vista, todo está bien en este código. Tiene la lógica básica, dividida en dos funciones, cada una de las cuales se puede aplicar por separado. Sin embargo, un programador experimentado dirá de inmediato que esto no funcionará, porque desde el prompt datos nos llegan como una cadena. Además, JS (tal es su naturaleza tolerante e indiferente) comenzará todo para nosotros, pero a la salida dará un sinsentido tan increíble que ni siquiera será fácil entender cómo llegamos a tal vida. Entonces, intentemos contar algo en nuestro ejemplo interactivo. Presentemos el número 3 en el número de variables y 1 2 3 en el campo de entrada de datos:



Que? Que? De acuerdo, esto es JavaScript. Hablemos mejor, ¿cómo podríamos evitar una conclusión tan extraña? Era necesario escribir en Python, nos advertiría humanamente sobre un error . Después de cada momento sospechoso, tuvimos que llegar a una conclusión sobre el tipo de variables y observar el estado de nuestra matriz.

Una variante del código en la que se reduce la probabilidad de salida inesperada:

  let input_number = prompt("  "); console.log(typeof(input_number)); let numbers = []; function toArray(input_number){ for (let i = 0; i < input_number; i++) { let x = prompt(`  ${i}`); numbers.push(x); } } toArray(input_number); console.log(numbers); function toAverage(numbers){ let sum = 0; for (let i = 0; i < numbers.length; i++) { sum += numbers[i]; } return sum/numbers.length; } console.log(typeof(toAverage(numbers))); alert(toAverage(numbers)); 


En otras palabras, pongo todos los lugares sospechosos en los que algo podría salir mal en la consola para asegurarme de que todo vaya como esperaba. Por supuesto, los datos de console.log son juguetes para niños, y normalmente, por supuesto, debe estudiar cualquier biblioteca decente para probar. Por ejemplo este . El resultado de este programa de depuración se puede ver en las herramientas para desarrolladores aquí . Creo que cómo solucionarlo no habrá preguntas, pero si es interesante, entonces aquí (y sí, esto se puede hacer simplemente con dos ventajas).



Paso arriba: Dominar las herramientas de desarrollo de Chrome


La depuración con console.log en 2019 ya es algo arcaico (pero aún así nunca lo olvidaremos, ya es como el nuestro). Todo desarrollador que quiera usar el orgulloso título de profesional debe dominar las ricas herramientas de las herramientas de desarrollo modernas.

Intentemos solucionar las áreas problemáticas en nuestro código usando Dev Tools. Si necesita documentación con ejemplos, puede leer todo aquí . E intentaremos analizar el ejemplo anterior usando Dev Tools.

Entonces, abrimos un ejemplo . Obviamente teníamos algún tipo de error oculto en el código, pero ¿cómo sabe en qué punto JavaScript comenzó a leer algo incorrectamente? Así es, envolvemos esta alegría con pruebas para el tipo de variable, es muy simple. Vamos a la pestaña Fuentes en las herramientas del desarrollador. Abra el archivo code.js Tendrá 3 partes: la primera a la izquierda, que muestra una lista de archivos, y la segunda, en la que mostramos el código. Pero la mayoría de la información que podemos obtener de la tercera parte desde abajo, que muestra el progreso de nuestro código. Pongamos un breakpoint de breakpoint en la línea 15 (para hacer esto, haga clic en el número de línea en la ventana donde se muestra el código, después de lo cual verá una etiqueta azul). Reinicie la página e ingrese cualquier valor en nuestro programa.



Ahora puede extraer mucha información útil del panel de debug inferior. Descubrirá que JS realmente no está pensando en el tipo de variables, porque los lenguajes estadísticos son estúpidamente mejores y solo necesita escribirlos para obtener programas que funcionen de manera previsible y rápidos que coloquen las variables como una cadena en nuestra matriz. Ahora, una vez que nos damos cuenta de lo que está sucediendo, podemos tomar contramedidas.

Aprendiendo a atrapar errores




El try ... catch construct se encuentra en todos los lenguajes de programación modernos. ¿Por qué es necesaria esta construcción de sintaxis? El hecho es que cuando ocurre un error en el código, detiene su ejecución en el lugar del error, y el intérprete no ejecutará todas las instrucciones adicionales. En una aplicación realmente funcional, de varios cientos de líneas de código, esto no nos conviene. Y supongamos que queremos interceptar el código de error, pasar el código al desarrollador y continuar la ejecución aún más.

Nuestro artículo estaría incompleto sin una breve descripción de los principales tipos de errores en JavaScript:

  • El error es el constructor general del objeto de error.
  • EvalError es el tipo de error que ocurre durante los errores de ejecución de eval() , pero no los errores de sintaxis, pero cuando esta función global se usa incorrectamente.
  • RangeError : ocurre cuando va más allá del rango permitido en la ejecución de su código.
  • ReferenceError : ocurre cuando intenta llamar a una variable, función u objeto que no está en el programa.
  • SyntaxError : error de sintaxis.
  • TypeError : se produce al intentar crear un objeto con un tipo de variable desconocido o al intentar llamar a un método inexistente
  • URIError es un código raro que ocurre cuando los métodos encodeURL y DecodeURL se usan incorrectamente.

Genial, practiquemos un poco ahora y veamos en la práctica dónde podemos usar la construcción try ... catch. El principio de funcionamiento de esta construcción es muy simple: el intérprete está intentando ejecutar el código dentro de try , si resulta, entonces todo continúa, como si esta construcción nunca existiera. Pero si ocurrió un error, lo interceptamos y podemos procesarlo, por ejemplo, diciéndole al usuario exactamente dónde cometió el error.

Creemos la calculadora más simple (incluso llamémosla calculadora en voz alta, yo diría: "ejecutor de las expresiones ingresadas"). Su ejemplo interactivo se puede encontrar aquí . Ok, ahora veamos nuestro código:

  let input = document.querySelector("#enter"); let button = document.querySelector("#enter_button"); let result_el = document.querySelector("#result "); button.onclick = () => { try { let result = eval(input.value); //,    ,  catch   result_el.innerHTML = result; } catch (error) { console.error(error.name); result_el.innerHTML = " -   ,  <br>   "; //  ,    ,     //       )) } } 


Si intenta ingresar la expresión matemática correcta, todo funcionará bien. Sin embargo, intente ingresar una expresión incorrecta, por ejemplo, solo una cadena, luego el programa mostrará una advertencia al usuario.

Con suerte, leerá más artículos que explican otras partes de la captura de errores, como este , para ampliar su comprensión de la depuración del programa y explorar otras construcciones de sintaxis como finally , así como generar sus propios errores.

Eso es todo. Espero que este artículo haya sido útil y ahora, cuando depure aplicaciones, se sentirá más seguro. Hemos analizado los errores típicos desde los más elementales que los recién llegados a la programación JS hacen solo unos días, hasta la técnica de captura de errores que utilizan los desarrolladores más avanzados.

Y según la tradición, enlaces útiles:




Eso es todo. Esperamos sus comentarios y lo invitamos a un seminario web gratuito , donde hablaremos sobre las características del marco SvelteJS .

Source: https://habr.com/ru/post/478764/


All Articles