{"id":47293,"date":"2022-02-08T14:07:03","date_gmt":"2022-02-08T13:07:03","guid":{"rendered":"https:\/\/kinsta.com\/es\/?p=47293&#038;preview=true&#038;preview_id=47293"},"modified":"2023-08-21T14:46:15","modified_gmt":"2023-08-21T12:46:15","slug":"errores-en-javascript","status":"publish","type":"post","link":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/","title":{"rendered":"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript"},"content":{"rendered":"<p>La ley de Murphy afirma que todo lo que puede salir mal, acabar\u00e1 saliendo mal. Esto se aplica demasiado bien en el mundo de la programaci\u00f3n. Si creas una aplicaci\u00f3n, lo m\u00e1s probable es que se produzcan errores y otros problemas. Los errores en JavaScript son uno de esos problemas habituales<\/p>\n<p>El \u00e9xito de un producto de software depende de lo bien que sus creadores puedan resolver estos problemas antes de perjudicar a sus usuarios. Y <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-javascript\/\">JavaScript<\/a>, de entre todos los <a href=\"https:\/\/kinsta.com\/es\/blog\/mejor-lenguaje-de-programacion-para-aprender\/\">lenguajes de programaci\u00f3n<\/a>, es notorio por su dise\u00f1o de gesti\u00f3n de errores mediocre.<\/p>\n<p>Si est\u00e1s <a href=\"https:\/\/kinsta.com\/es\/blog\/bibliotecas-javascript\/\">construyendo una aplicaci\u00f3n en<\/a> JavaScript, hay muchas posibilidades de que metas la pata con los tipos de datos en un momento u otro. Si no es eso, puede que acabes sustituyendo un <i>indefinido <\/i>por un <i>nulo<\/i> o un operador de igualdad triple (<code>===<\/code>) por un operador de igualdad doble (<code>==<\/code>).<\/p>\n<p>Es humano cometer errores. Por eso te mostraremos todo lo que necesitas saber sobre el manejo de errores en JavaScript.<\/p>\n<p>Este art\u00edculo te guiar\u00e1 a trav\u00e9s de los errores b\u00e1sicos en JavaScript y te explicar\u00e1 los distintos errores que puedes encontrar. A continuaci\u00f3n, aprender\u00e1s a identificar y solucionar estos errores. Tambi\u00e9n hay un par de consejos para manejar los errores con eficacia en entornos de producci\u00f3n.<\/p>\n<p>Sin m\u00e1s pre\u00e1mbulos, \u00a1comencemos!<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h3>Mira Nuestro Videotutorial para <a href=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\">Gestionar los Errores de JavaScript<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\"><\/kinsta-video>\n<h2>\u00bfQu\u00e9 Son los Errores de JavaScript?<\/h2>\n<p>Los errores en programaci\u00f3n se refieren a situaciones que no permiten que un programa funcione normalmente. Pueden ocurrir cuando un programa no sabe c\u00f3mo manejar el trabajo que tiene en cuesti\u00f3n, como cuando intenta abrir un archivo inexistente o llegar a un punto final de la API basada en la web mientras no hay conectividad de red.<\/p>\n<p>Estas situaciones que el programa lance errores al usuario, indicando que no sabe c\u00f3mo proceder. El programa recoge toda la informaci\u00f3n posible sobre el error y luego informa de que no puede seguir adelante.<\/p>\n\n<p>Los programadores inteligentes intentan predecir y cubrir estos escenarios para que el usuario no tenga que averiguar un <a href=\"https:\/\/kinsta.com\/es\/blog\/codigos-de-estado-de-http\/\">mensaje de error t\u00e9cnico como \u00ab404\u00bb<\/a> de forma independiente. En su lugar, muestran un mensaje mucho m\u00e1s comprensible \u00abNo se pudo encontrar la p\u00e1gina\u00bb.<\/p>\n<p>Los errores en JavaScript son objetos que se muestran cada vez que se produce un error de programaci\u00f3n. Estos objetos contienen amplia informaci\u00f3n sobre el tipo de error, la sentencia que lo ha provocado y el seguimiento de la pila cuando se ha producido el error. JavaScript tambi\u00e9n permite a los programadores crear errores personalizados para proporcionar informaci\u00f3n adicional al depurar problemas.<\/p>\n<h3>Propiedades de un Error<\/h3>\n<p>Ahora que la definici\u00f3n de un error de JavaScript est\u00e1 clara, es hora de entrar en los detalles.<\/p>\n<p>Los errores en JavaScript conllevan ciertas propiedades est\u00e1ndar y personalizadas que ayudan a comprender la causa y los efectos del error. Por defecto, los errores en JavaScript contienen tres propiedades:<\/p>\n<ol>\n<li><b>mensaje<\/b>: Un valor de cadena que lleva el mensaje de error<\/li>\n<li><b>nombre<\/b>: El tipo de error que se ha producido (nos adentraremos en esto en la siguiente secci\u00f3n)<\/li>\n<li><b>pila<\/b>: El rastro de la pila del c\u00f3digo ejecutado cuando se produjo el error.<\/li>\n<\/ol>\n<p>Adem\u00e1s, los errores tambi\u00e9n pueden llevar propiedades como <i>columnNumber, lineNumber, fileName, <\/i>etc., para describir mejor el error. Sin embargo, estas propiedades no son est\u00e1ndar y pueden o no estar presentes en todos los objetos de error generados desde tu aplicaci\u00f3n JavaScript.<\/p>\n<h3>Comprender el Seguimiento de la Pila (Stack Trace)<\/h3>\n<p>Un seguimiento de la pila es la lista de llamadas a m\u00e9todos en la que se encontraba un programa cuando se produce un evento como una excepci\u00f3n o una advertencia. Este es el aspecto de un ejemplo de rastreo de pila acompa\u00f1ado de una excepci\u00f3n:<\/p>\n<figure id=\"attachment_110237\" aria-describedby=\"caption-attachment-110237\" style=\"width: 1138px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110237 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-output-numeric.png\" alt=\"The error \u201cTypeError: Numeric argument is expected\u201d is shown on a gray background with additional stack details.\" width=\"1138\" height=\"278\"><figcaption id=\"caption-attachment-110237\" class=\"wp-caption-text\">Ejemplo de un Stack Trace.<\/figcaption><\/figure>\n<p>Como puedes ver, empieza imprimiendo el nombre y el mensaje del error, seguido de una lista de los m\u00e9todos a los que se ha llamado. Cada llamada a un m\u00e9todo indica la ubicaci\u00f3n de su c\u00f3digo fuente y la l\u00ednea en la que fue invocado. Puedes utilizar estos datos para navegar por tu c\u00f3digo base e identificar qu\u00e9 parte del c\u00f3digo est\u00e1 causando el error.<\/p>\n<p>Esta lista de m\u00e9todos est\u00e1 ordenada de forma apilada. Muestra d\u00f3nde se lanz\u00f3 primero tu excepci\u00f3n y c\u00f3mo se propag\u00f3 a trav\u00e9s de las llamadas a m\u00e9todos apilados. Implementar una captura para la excepci\u00f3n no permitir\u00e1 que se propague por la pila y que se bloquee tu programa. Sin embargo, es posible que quieras dejar sin atrapar los errores fatales para que el programa se bloquee en algunos escenarios de manera intencionada.<\/p>\n<h3>Errores vs. Excepciones<\/h3>\n<p>La mayor\u00eda de la gente suele considerar que los errores y las excepciones son lo mismo. Sin embargo, es esencial tener en cuenta una ligera, pero fundamental diferencia entre ellos.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style- info\">\n        <p>Una excepci\u00f3n es un objeto de error que se ha lanzado<\/p>\n<\/aside>\n\n<p>Para entenderlo mejor, pongamos un ejemplo r\u00e1pido. As\u00ed es como se puede definir un error en JavaScript:<\/p>\n<pre><code class=\"language-js\">const wrongTypeError = TypeError(\"Wrong type found, expected character\")<code><\/code><\/code><\/pre>\n<p>Y as\u00ed es como el objeto <code><i>wrongTypeError<\/i><\/code> se convierte en una excepci\u00f3n:<\/p>\n<pre><code class=\"language-js\">throw wrongTypeError<\/code><\/pre>\n<p>Sin embargo, la mayor\u00eda de la gente tiende a utilizar la forma abreviada que define los objetos de error mientras los lanza:<\/p>\n<pre><code class=\"language-js\">throw TypeError(\"Wrong type found, expected character\")<\/code><\/pre>\n<p>Se trata de una pr\u00e1ctica habitual. Sin embargo, es una de las razones por las que los desarrolladores tienden a confundir las excepciones y los errores. Por lo tanto, conocer los fundamentos es vital aunque utilices la forma abreviada para hacer tu trabajo r\u00e1pidamente.<\/p>\n<h2>Tipos de Errores en JavaScript<\/h2>\n<p>Hay una serie de tipos de error predefinidos en JavaScript. Son elegidos y definidos autom\u00e1ticamente por el entorno de ejecuci\u00f3n de JavaScript cuando el programador no maneja expl\u00edcitamente los errores en la aplicaci\u00f3n.<\/p>\n<p>Esta secci\u00f3n te guiar\u00e1 a trav\u00e9s de algunos de los tipos de error m\u00e1s comunes en JavaScript y entender\u00e1s cu\u00e1ndo y por qu\u00e9 se producen.<\/p>\n<h3>RangeError<\/h3>\n<p>Un RangeError se lanza cuando se establece una variable con un valor fuera de su rango de valores legales. Suele ocurrir cuando se pasa un valor como argumento a una funci\u00f3n, y el valor dado no se encuentra en el rango de los par\u00e1metros de la funci\u00f3n. A veces puede ser dif\u00edcil de solucionar cuando se utilizan bibliotecas de terceros mal documentadas, ya que necesitas conocer el rango de valores posibles de los argumentos para pasar el valor correcto.<\/p>\n<p>Algunas de las situaciones m\u00e1s comunes en las que se produce el RangeError son:<\/p>\n<ul>\n<li>Intentar crear un array de longitudes ilegales mediante el constructor Array.<\/li>\n<li>Pasar valores err\u00f3neos a m\u00e9todos num\u00e9ricos como <code>toExponential()<\/code>, <code>toPrecision()<\/code>, <code>toFixed()<\/code>, etc.<\/li>\n<li>Pasando valores ilegales a funciones de cadena como <code>normalize()<\/code>.<\/li>\n<\/ul>\n<h3>ReferenceError<\/h3>\n<p>Un ReferenceError se produce cuando algo est\u00e1 mal con la referencia de una variable en tu c\u00f3digo. Puede que hayas olvidado definir un valor para la variable antes de usarla, o puede que est\u00e9s intentando utilizar una variable inaccesible en tu c\u00f3digo. En cualquier caso, revisar el seguimiento de la pila proporciona amplia informaci\u00f3n para encontrar y arreglar la referencia de la variable que est\u00e1 en mal estado.<\/p>\n<p>Algunas de las razones m\u00e1s comunes por las que se producen errores de referencia son:<\/p>\n<ul>\n<li>Escribir un error en el nombre de una variable.<\/li>\n<li>Intentar acceder a variables de \u00e1mbito de bloque fuera de su \u00e1mbito.<\/li>\n<li>Hacer referencia a una variable global de una biblioteca externa (como <a href=\"https:\/\/kinsta.com\/es\/blog\/jquery-no-esta-definido\/\">$ de jQuery<\/a>) antes de que se cargue.<\/li>\n<\/ul>\n<h3>Error de Sintaxis<\/h3>\n<p>Estos errores son uno de los m\u00e1s sencillos de solucionar, ya que indican un error en la sintaxis del c\u00f3digo. Dado que JavaScript es un <a href=\"https:\/\/kinsta.com\/es\/blog\/lenguajes-script\/\">lenguaje de scripting<\/a> que se interpreta y no se compila, se lanzan cuando la aplicaci\u00f3n ejecuta el script que contiene el error. En el caso de los lenguajes compilados, estos errores se identifican durante la compilaci\u00f3n. Por lo tanto, los binarios de la aplicaci\u00f3n no se crean hasta que se corrigen.<\/p>\n<p>Algunas de las razones m\u00e1s comunes por las que pueden producirse SyntaxErrors son:<\/p>\n<ul>\n<li>Faltan comillas<\/li>\n<li>Falta de par\u00e9ntesis de cierre<\/li>\n<li>Alineaci\u00f3n incorrecta de las llaves u otros caracteres<\/li>\n<\/ul>\n<p>Es una buena pr\u00e1ctica utilizar una herramienta de linting en tu IDE para identificar estos errores antes de que lleguen al navegador.<\/p>\n<h3>TypeError<\/h3>\n<p>TypeError es uno de los errores m\u00e1s comunes en las aplicaciones de JavaScript. Este error se produce cuando alg\u00fan valor no resulta ser de un determinado tipo esperado. Algunos de los casos m\u00e1s comunes en los que se produce son:<\/p>\n<ul>\n<li>Invocar objetos que no son m\u00e9todos.<\/li>\n<li>Intentar acceder a propiedades de objetos nulos o indefinidos<\/li>\n<li>Tratar una cadena como un n\u00famero o viceversa<\/li>\n<\/ul>\n<p>Hay muchas m\u00e1s posibilidades en las que puede producirse un TypeError. M\u00e1s adelante veremos algunos casos famosos y aprenderemos a solucionarlos.<\/p>\n<h3>InternalError<\/h3>\n<p>El tipo InternalError se utiliza cuando se produce una excepci\u00f3n en el motor de ejecuci\u00f3n de JavaScript. Puede indicar o no un problema con tu c\u00f3digo.<\/p>\n<p>La mayor\u00eda de las veces, el InternalError solo se produce en dos casos:<\/p>\n<ul>\n<li>Cuando un parche o una actualizaci\u00f3n del entorno de ejecuci\u00f3n de JavaScript conlleva un error que lanza excepciones (esto ocurre muy raramente).<\/li>\n<li>Cuando tu c\u00f3digo contenga entidades demasiado grandes para el motor de JavaScript (por ejemplo, demasiados casos de conmutaci\u00f3n, inicializadores de matrices demasiado grandes, demasiada recursi\u00f3n).<\/li>\n<\/ul>\n<p>El enfoque m\u00e1s adecuado para resolver este error es identificar la causa a trav\u00e9s del mensaje de error y reestructurar la l\u00f3gica de tu aplicaci\u00f3n, si es posible, para eliminar el repentino aumento de la carga de trabajo en el motor de JavaScript.<\/p>\n<h3>URIError<\/h3>\n<p>El URIError se produce cuando se utiliza de forma ilegal una funci\u00f3n global de manejo de URI como <code>decodeURIComponent<\/code>. Suele indicar que el par\u00e1metro pasado a la llamada del m\u00e9todo no se ajustaba a los est\u00e1ndares de URI y, por tanto, no fue <a href=\"https:\/\/kinsta.com\/es\/blog\/diferir-el-analisis-de-javascript\/\">analizado por el m\u00e9todo correctamente<\/a>.<\/p>\n<p>Diagnosticar estos errores suele ser f\u00e1cil, ya que solo tienes que examinar los argumentos para ver si est\u00e1n mal formados.<\/p>\n<h3>EvalError<\/h3>\n<p>Un EvalError se produce cuando se produce un error en una llamada a la funci\u00f3n <code>eval()<\/code>. La funci\u00f3n <code>eval()<\/code> se usa para ejecutar c\u00f3digo JavaScript almacenado en cadenas. Sin embargo, como el uso de la funci\u00f3n <code>eval()<\/code> est\u00e1 muy desaconsejado por cuestiones de seguridad y las especificaciones actuales de ECMAScript ya no lanzan la clase <code>EvalError<\/code>, este tipo de error existe simplemente para mantener la compatibilidad con el c\u00f3digo JavaScript antiguo.<\/p>\n<p>Si est\u00e1s trabajando en una versi\u00f3n antigua de JavaScript, es posible que te encuentres con este error. En cualquier caso, lo mejor es investigar el c\u00f3digo ejecutado en la llamada a la funci\u00f3n <code>eval()<\/code> para ver si hay alguna excepci\u00f3n.<\/p>\n<h2>Crear Tipos de Error Personalizados<\/h2>\n<p>Aunque JavaScript ofrece una lista adecuada de clases de tipos de error para cubrir la mayor\u00eda de los escenarios, siempre puedes crear un nuevo tipo de error si la lista no satisface tus necesidades. La base de esta flexibilidad reside en el hecho de que JavaScript te permite lanzar literalmente cualquier cosa con el comando <code>throw<\/code>.<\/p>\n<p>As\u00ed que, t\u00e9cnicamente, estas declaraciones son totalmente legales:<\/p>\n<pre><code class=\"language-js\">throw 8\nthrow \"An error occurred\"<\/code><\/pre>\n<p>Sin embargo, lanzar un tipo de dato primitivo no proporciona detalles sobre el error, como su tipo, nombre o el seguimiento de la pila que lo acompa\u00f1a. Para solucionar esto y estandarizar el proceso de gesti\u00f3n de errores, se ha proporcionado la clase <code>Error<\/code>. Tambi\u00e9n se desaconseja utilizar tipos de datos primitivos al lanzar excepciones.<\/p>\n<p>Puedes extender la clase <code>Error<\/code> para crear tu clase de error personalizada. Aqu\u00ed tienes un ejemplo b\u00e1sico de c\u00f3mo puedes hacerlo:<\/p>\n<pre><code class=\"language-js\">class ValidationError extends Error {\n    constructor(message) {\n        super(message);\n        this.name = \"ValidationError\";\n    }\n}<\/code><\/pre>\n<p>Y puedes utilizarlo de la siguiente manera:<\/p>\n<pre><code class=\"language-js\">throw ValidationError(\"Property not found: name\")<\/code><\/pre>\n<p>Y puedes identificarlo utilizando la palabra clave <code>instanceof<\/code>:<\/p>\n<pre><code class=\"language-js\">try {\n    validateForm() \/\/ code that throws a ValidationError\n} catch (e) {\n    if (e instanceof ValidationError)\n    \/\/ do something\n    else\n    \/\/ do something else\n}<\/code><\/pre>\n<h2>Los 10 Errores m\u00e1s Comunes en JavaScript<\/h2>\n<p>Ahora que entiendes los tipos de error m\u00e1s comunes y c\u00f3mo crear los tuyos propios, es el momento de ver algunos de los errores m\u00e1s comunes a los que te enfrentar\u00e1s al escribir c\u00f3digo JavaScript.<\/p>\n<h3>Consulta Nuestro Videotutorial Sobre Los <a href=\"https:\/\/www.youtube.com\/watch?v=IXrqv7Szv_g\">Errores M\u00e1s Comunes De JavaScript<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=IXrqv7Szv_g\"><\/kinsta-video>\n<h3>1. Uncaught RangeError<\/h3>\n<p>Este error se produce en Google Chrome en varios escenarios. En primer lugar, puede ocurrir si llamas a una funci\u00f3n recursiva y esta no termina. Puedes comprobarlo t\u00fa mismo en la consola de desarrollador de Chrome:<\/p>\n<figure id=\"attachment_110241\" aria-describedby=\"caption-attachment-110241\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110241 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/recur-range-error.png\" alt=\"The error \u201cUncaught RangeError: Maximum call stack size exceeded\u201d is shown on a red background beside a red cross icon with a recursive function\u2019s code above it.\" width=\"1392\" height=\"492\"><figcaption id=\"caption-attachment-110241\" class=\"wp-caption-text\">Ejemplo de RangeError con una llamada a una funci\u00f3n recursiva.<\/figcaption><\/figure>\n<p>Por lo tanto, para solucionar este error, aseg\u00farate de definir correctamente los casos l\u00edmite de tu funci\u00f3n recursiva. Otra raz\u00f3n por la que se produce este error es si has pasado un valor que est\u00e1 fuera del rango de los par\u00e1metros de la funci\u00f3n. Aqu\u00ed tienes un ejemplo:<\/p>\n<figure id=\"attachment_110239\" aria-describedby=\"caption-attachment-110239\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110239 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-range-error.png\" alt=\"The error \u201cUncaught RangeError: toExponential() argument must be between 0 and 100\u201d is shown on a red background beside a red cross icon with a toExponential() function call above it.\" width=\"1392\" height=\"150\"><figcaption id=\"caption-attachment-110239\" class=\"wp-caption-text\">Ejemplo de RangeError con la llamada toExponential().<\/figcaption><\/figure>\n<p>El mensaje de error suele indicar lo que est\u00e1 mal en tu c\u00f3digo. Una vez que hagas los cambios, se resolver\u00e1.<\/p>\n<figure id=\"attachment_110240\" aria-describedby=\"caption-attachment-110240\" style=\"width: 1396px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110240 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/toExponential-error-fixed.png\" alt=\"num = 4. num.toExponential(2). Output: 4.00e+0.\" width=\"1396\" height=\"100\"><figcaption id=\"caption-attachment-110240\" class=\"wp-caption-text\">Salida de la llamada a la funci\u00f3n toExponential().<\/figcaption><\/figure>\n<h3>2. Uncaught TypeError: No se Puede Establecer la Propiedad<\/h3>\n<p>Este error se produce cuando estableces una propiedad en una referencia no definida. Puedes reproducir el problema con este c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">var list\nlist.count = 0<code><\/code><\/code><\/pre>\n<p>Esta es la salida que recibir\u00e1s:<\/p>\n<figure id=\"attachment_110245\" aria-describedby=\"caption-attachment-110245\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110245 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot set properties of undefined\u201d is shown on a red background beside a red cross icon with a list.count = 0 assignment above it.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110245\" class=\"wp-caption-text\">Ejemplo de TypeError.<\/figcaption><\/figure>\n<p>Para solucionar este error, inicializa la referencia con un valor antes de acceder a sus propiedades. As\u00ed es como se ve cuando se arregla:<\/p>\n<figure id=\"attachment_110246\" aria-describedby=\"caption-attachment-110246\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110246 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/list-count-fixed.png\" alt=\"Setting list.count = 10 after initializing list with {} due to which the output is 10.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110246\" class=\"wp-caption-text\">C\u00f3mo solucionar el TypeError.<\/figcaption><\/figure>\n<h3>3. Uncaught TypeError: No se Puede Leer la Propiedad<\/h3>\n<p>Este es uno de los errores m\u00e1s frecuentes en JavaScript. Este error se produce cuando intentas leer una propiedad o llamar a una funci\u00f3n sobre un objeto no definido. Puedes reproducirlo muy f\u00e1cilmente ejecutando el siguiente c\u00f3digo en la consola de Chrome Developer:<\/p>\n<pre><code class=\"language-js\">var func\nfunc.call()<code><\/code><\/code><\/pre>\n<p>Este es el resultado:<\/p>\n<figure id=\"attachment_110249\" aria-describedby=\"caption-attachment-110249\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110249 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot read properties of undefined\u201d is shown on a red background beside a red cross icon with func.call() above it.\" width=\"1100\" height=\"162\"><figcaption id=\"caption-attachment-110249\" class=\"wp-caption-text\">Ejemplo de TypeError con funci\u00f3n indefinida.<\/figcaption><\/figure>\n<p>Un objeto indefinido es una de las muchas causas posibles de este error. Otra causa destacada de este problema puede ser una inicializaci\u00f3n incorrecta del estado al renderizar la UI. Aqu\u00ed tienes un ejemplo del mundo real de una aplicaci\u00f3n React:<\/p>\n<pre><code class=\"language-js\">import React, { useState, useEffect } from \"react\";\n\nconst CardsList = () =&gt; {\n\n    const [state, setState] = useState();\n\n    useEffect(() =&gt; {\n        setTimeout(() =&gt; setState({ items: [\"Card 1\", \"Card 2\"] }), 2000);\n    }, []);\n\n    return (\n        &lt;&gt;\n            {state.items.map((item) =&gt; (\n                &lt;li key={item}&gt;{item}&lt;\/li&gt;\n            ))}\n        &lt;\/&gt;\n    );\n};\n\nexport default CardsList;<\/code><\/pre>\n<p>La aplicaci\u00f3n comienza con un contenedor de estado vac\u00edo y se le proporcionan algunos elementos despu\u00e9s de un retraso de 2 segundos. El retraso se pone para imitar una llamada de red. Incluso si tu red es superr\u00e1pida, te encontrar\u00e1s con un peque\u00f1o retraso debido al cual el componente se renderizar\u00e1 al menos una vez. Si intentas ejecutar esta aplicaci\u00f3n, recibir\u00e1s el siguiente error:<\/p>\n<figure id=\"attachment_110234\" aria-describedby=\"caption-attachment-110234\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110234 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/undefined-type-error-output.png\" alt=\"The error \u201cundefined is not an object\u201d is shown on a grey background.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110234\" class=\"wp-caption-text\">TypeError stack trace in a browser.<\/figcaption><\/figure>\n<p>Esto se debe a que, en el momento de la renderizaci\u00f3n, el contenedor de estado est\u00e1 indefinido; por tanto, no existe ninguna propiedad <code>items<\/code> sobre \u00e9l. Solucionar este error es f\u00e1cil. Solo tienes que proporcionar un valor inicial por defecto al contenedor de estado.<\/p>\n<pre><code class=\"language-js\">\/\/ ...\nconst [state, setState] = useState({items: []});\n\/\/ ...<\/code><\/pre>\n<p>Ahora, tras el retraso establecido, tu aplicaci\u00f3n mostrar\u00e1 una salida similar:<\/p>\n<figure id=\"attachment_110251\" aria-describedby=\"caption-attachment-110251\" style=\"width: 1180px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110251 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/cards-list-output.png\" alt=\"A bulleted list with two items reading \"Card 1\" and \"Card 2\".\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110251\" class=\"wp-caption-text\">Salida del c\u00f3digo.<\/figcaption><\/figure>\n<p>La soluci\u00f3n exacta en tu c\u00f3digo puede ser diferente, pero la esencia aqu\u00ed es inicializar siempre tus variables correctamente antes de usarlas.<\/p>\n<h3>4. TypeError: &#8216;undefined&#8217; no es un Objeto<\/h3>\n<p>Este error se produce en Safari cuando intentas acceder a las propiedades o llamar a un m\u00e9todo de un objeto no definido. Puedes ejecutar el mismo c\u00f3digo de arriba para reproducir el error t\u00fa mismo.<\/p>\n<figure id=\"attachment_110250\" aria-describedby=\"caption-attachment-110250\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110250 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-call-type-error-undefined.png\" alt=\"The error \u201cTypeError: undefined is not an object\u201d shown on a red background beside a red exclamation point icon with func.call() method call above it.\" width=\"1146\" height=\"172\"><figcaption id=\"caption-attachment-110250\" class=\"wp-caption-text\">Ejemplo de TypeError con funci\u00f3n indefinida.<\/figcaption><\/figure>\n<p>La soluci\u00f3n a este error tambi\u00e9n es la misma: aseg\u00farate de que has inicializado tus variables correctamente y que no est\u00e1n indefinidas cuando se accede a una propiedad o m\u00e9todo.<\/p>\n<h3>5. TypeError: null no es un Objeto<\/h3>\n<p>Esto es, de nuevo, similar al error anterior. Se produce en Safari, y la \u00fanica diferencia entre los dos errores es que este se lanza cuando el objeto a cuya propiedad o m\u00e9todo se accede es <code>null<\/code> en lugar de <code>undefined<\/code>. Puedes reproducirlo ejecutando el siguiente fragmento de c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">var func = null\n\nfunc.call()<\/code><\/pre>\n<p>Esta es la salida que recibir\u00e1s:<\/p>\n<figure id=\"attachment_110243\" aria-describedby=\"caption-attachment-110243\" style=\"width: 1146px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110243 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/null-object-error.png\" alt=\"The \"TypeError: null is not an object\" error message, shown on a red background beside a red exclamation point icon.\" width=\"1146\" height=\"142\"><figcaption id=\"caption-attachment-110243\" class=\"wp-caption-text\">Ejemplo de TypeError con la funci\u00f3n null.<\/figcaption><\/figure>\n<p>Dado que <code>null<\/code> es un valor establecido expl\u00edcitamente a una variable y no asignado autom\u00e1ticamente por JavaScript. Este error solo puede producirse si intentas acceder a una variable que hayas establecido t\u00fa mismo en <code>null<\/code>. Por lo tanto, debes revisar tu c\u00f3digo y comprobar si la l\u00f3gica que has escrito es correcta o no.<\/p>\n<h3>6. TypeError: No se Puede Leer la Propiedad &#8216;length&#8217;<\/h3>\n<p>Este error se produce en Chrome cuando intentas leer la longitud de un objeto <code>null<\/code> o <code>undefined<\/code>. La causa de este problema es similar a la de los problemas anteriores, pero se produce con bastante frecuencia al manejar listas, por lo que merece una menci\u00f3n especial. A continuaci\u00f3n te explicamos c\u00f3mo puedes reproducir el problema:<\/p>\n<figure id=\"attachment_110244\" aria-describedby=\"caption-attachment-110244\" style=\"width: 937px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110244 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/myButton-length-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot read property 'length' of undefined\u201d shown on a red background beside a red cross icon with myButton.length call above it.\" width=\"937\" height=\"230\"><figcaption id=\"caption-attachment-110244\" class=\"wp-caption-text\">Ejemplo de TypeError con un objeto indefinido.<\/figcaption><\/figure>\n<p>Sin embargo, en las nuevas versiones de Chrome, este error se reporta como <code>Uncaught TypeError: Cannot read properties of undefined<\/code>. As\u00ed es como se ve ahora:<\/p>\n<figure id=\"attachment_110247\" aria-describedby=\"caption-attachment-110247\" style=\"width: 1400px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110247 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/length-type-error.png\" alt=\"The error \u201cUncaught TypeError: Cannot read properties of undefined\u201d shown on a red background beside a red cross icon with myButton.length call above it.\" width=\"1400\" height=\"174\"><figcaption id=\"caption-attachment-110247\" class=\"wp-caption-text\">Ejemplo de TypeError con un objeto indefinido en las versiones m\u00e1s recientes de Chrome.<\/figcaption><\/figure>\n<p>La soluci\u00f3n, de nuevo, es asegurarse de que el objeto al que intentas acceder existe y no est\u00e1 configurado como <code>null<\/code>.<\/p>\n<h3>7. TypeError: &#8216;undefined&#8217; no es una Funci\u00f3n<\/h3>\n<p>Este error se produce cuando intentas invocar un m\u00e9todo que no existe en tu script, o que s\u00ed existe, pero no puede ser referenciado en el contexto de llamada. Este error suele producirse en Google Chrome, y puedes solucionarlo verificando la l\u00ednea de c\u00f3digo que arroja el error. Si encuentras un error tipogr\u00e1fico, arr\u00e9glalo y comprueba si se soluciona el problema.<\/p>\n<p>Si has utilizado la palabra clave de autorreferencia <code>this<\/code> en tu c\u00f3digo, este error puede surgir si <code>this<\/code> no est\u00e1 adecuadamente vinculado a tu contexto. Considera el siguiente c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">function showAlert() {\n    alert(\"message here\")\n}\n\ndocument.addEventListener(\"click\", () =&gt; {\n    this.showAlert();\n})<\/code><\/pre>\n<p>Si ejecutas el c\u00f3digo anterior, se producir\u00e1 el error que hemos comentado. Esto ocurre porque la funci\u00f3n an\u00f3nima pasada como oyente de eventos se est\u00e1 ejecutando en el contexto de <code>document<\/code>.<\/p>\n<p>En cambio, la funci\u00f3n <code>showAlert<\/code> est\u00e1 definida en el contexto del <code>window<\/code>.<\/p>\n<p>Para solucionarlo, debes pasar la referencia adecuada a la funci\u00f3n vincul\u00e1ndola con el m\u00e9todo <code>bind()<\/code>:<\/p>\n<pre><code class=\"language-js\">document.addEventListener(\"click\", this.showAlert.bind(this))<\/code><\/pre>\n<h3>8. ReferenceError: el Evento no Est\u00e1 Definido<\/h3>\n<p>Este error se produce cuando intentas acceder a una referencia no definida en el \u00e1mbito de llamada. Esto suele ocurrir cuando se manejan eventos, ya que a menudo te proporcionan una referencia llamada <code>event<\/code> en la funci\u00f3n de devoluci\u00f3n de llamada. Este error puede producirse si te olvidas de definir el argumento del evento en los par\u00e1metros de tu funci\u00f3n o lo escribes mal.<\/p>\n<p>Este error puede no producirse en Internet Explorer o Google Chrome (ya que IE ofrece una variable de evento global y Chrome adjunta la variable de evento autom\u00e1ticamente al manejador), pero s\u00ed puede producirse en Firefox. As\u00ed que es aconsejable estar atento a estos peque\u00f1os errores.<\/p>\n<h3>9. TypeError: Asignaci\u00f3n a una Variable Constante<\/h3>\n<p>Este es un error que surge por un descuido. Si intentas asignar un nuevo valor a una variable constante, te encontrar\u00e1s con este resultado:<\/p>\n<figure id=\"attachment_110248\" aria-describedby=\"caption-attachment-110248\" style=\"width: 1392px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110248 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/func-type-error.png\" alt=\"The error \u201cUncaught TypeError: Assignment to constant variable\u201d shown on a red background beside a red cross icon with func = 6 assignment above it.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110248\" class=\"wp-caption-text\">Ejemplo de TypeError con asignaci\u00f3n de objeto constante.<\/figcaption><\/figure>\n<p>Aunque ahora parece f\u00e1cil de arreglar, \u00a1imagina cientos de declaraciones de variables de este tipo y que una de ellas se defina por error como <code>const<\/code> en lugar de <code>let<\/code>! <a href=\"https:\/\/kinsta.com\/es\/blog\/php-vs-javascript\/#variable-and-constant-definitions\">A diferencia de otros lenguajes de scripting como PHP<\/a>, la diferencia entre el estilo de declaraci\u00f3n de constantes y variables en JavaScript es m\u00ednima. Por lo tanto, es aconsejable que compruebes tus declaraciones en primer lugar cuando te encuentres con este error. Tambi\u00e9n puedes encontrarte con este error si<i> olvidas<\/i> que dicha referencia es una constante y la utilizas como una variable. Esto indica un descuido o un fallo en la l\u00f3gica de tu aplicaci\u00f3n. Aseg\u00farate de verificarlo cuando intentes solucionar este problema.<\/p>\n<h3>10. (unknown): Error de Script<\/h3>\n<p>Un error de script se produce cuando un script de terceros env\u00eda un error a tu navegador. Este error va seguido de (desconocido) porque el script de terceros pertenece a un dominio diferente al de tu aplicaci\u00f3n. El navegador oculta otros detalles para evitar la filtraci\u00f3n de informaci\u00f3n sensible del script de terceros.<\/p>\n<p>No puedes resolver este error sin conocer todos los detalles. Esto es lo que puedes hacer para obtener m\u00e1s informaci\u00f3n sobre el error:<\/p>\n<ol>\n<li>A\u00f1ade el atributo <code>crossorigin<\/code> en la etiqueta script.<\/li>\n<li>Establece la cabecera <code>Access-Control-Allow-Origin<\/code> correcta en el servidor que aloja el script.<\/li>\n<li>[Opcional] Si no tienes acceso al servidor que aloja el script, puedes considerar la posibilidad de utilizar un proxy para retransmitir tu petici\u00f3n al servidor y devolverla al cliente con las cabeceras correctas.<\/li>\n<\/ol>\n<p>Una vez que puedas acceder a los detalles del error, podr\u00e1s ponerte manos a la obra para solucionar el problema, que probablemente estar\u00e1 relacionado con la biblioteca de terceros o con la red.<\/p>\n<h2>C\u00f3mo Identificar y Prevenir Errores en JavaScript<\/h2>\n<p>Aunque los errores comentados anteriormente son los m\u00e1s comunes y frecuentes en JavaScript con los que te encontrar\u00e1s, basarse en algunos ejemplos nunca es suficiente. Es vital entender c\u00f3mo detectar y prevenir cualquier tipo de error en una aplicaci\u00f3n JavaScript mientras la desarrollas. A continuaci\u00f3n te explicamos c\u00f3mo puedes manejar los errores en JavaScript.<\/p>\n<h3>Lanzar y Atrapar Errores Manualmente<\/h3>\n<p>La forma m\u00e1s fundamental de manejar los errores lanzados manualmente o por el entorno de ejecuci\u00f3n es atraparlos. Como la mayor\u00eda de los lenguajes, JavaScript ofrece un conjunto de palabras clave para manejar los errores. Es esencial que conozcas cada una de ellas en profundidad antes de ponerte a gestionar errores en tu aplicaci\u00f3n JavaScript.<\/p>\n<h4>throw<\/h4>\n<p>La primera y m\u00e1s b\u00e1sica palabra clave del conjunto es <code>throw<\/code>. Como es evidente, la palabra clave throw se utiliza para lanzar errores y crear excepciones en el entorno de ejecuci\u00f3n de JavaScript de forma manual. Ya hemos hablado de esto anteriormente en este art\u00edculo, y aqu\u00ed est\u00e1 la esencia del significado de esta palabra clave:<\/p>\n<ul>\n<li>Puedes hacer <code>throw<\/code> a cualquier cosa, incluyendo n\u00fameros, cadenas y objetos <code>Error<\/code>.<\/li>\n<li>Sin embargo, no es aconsejable lanzar tipos de datos primitivos como cadenas y n\u00fameros, ya que no llevan informaci\u00f3n de depuraci\u00f3n sobre los errores.<\/li>\n<li>Ejemplo <code>throw TypeError(\"Please provide a string\")<\/code><\/li>\n<\/ul>\n<h4>try<\/h4>\n<p>La palabra clave <code>try<\/code> se usa para indicar que un bloque de c\u00f3digo puede lanzar una excepci\u00f3n. Su sintaxis es:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ error-prone code here\n}<\/code><\/pre>\n<p>Es importante tener en cuenta que un bloque <code>catch<\/code> debe seguir siempre al bloque <code>try<\/code> para manejar los errores con eficacia.<\/p>\n<h4>catch<\/h4>\n<p>La palabra clave <code>catch<\/code> se usa para crear un bloque catch. Este bloque de c\u00f3digo se encarga de gestionar los errores que el bloque <code>try<\/code> atrapa. Esta es su sintaxis:<\/p>\n<pre><code class=\"language-js\">catch (exception) {\n    \/\/ code to handle the exception here\n}<\/code><\/pre>\n<p>Y as\u00ed es como se implementan los bloques <code>try<\/code> y <code>catch<\/code> juntos:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    \/\/ error handling code\n}<\/code><\/pre>\n<p>A diferencia de C++ o Java, en JavaScript no puedes a\u00f1adir varios bloques <code>catch<\/code> a un bloque <code>try<\/code>. Esto significa que no puedes hacer esto:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    }\n} catch (exception) {\n    if (exception instanceof RangeError) {\n    \/\/ do something\n    }\n}<\/code><\/pre>\n<p>En su lugar, puedes utilizar una sentencia <code>if...else<\/code> o una sentencia switch case dentro del bloque catch \u00fanico para manejar todos los posibles casos de error. El aspecto ser\u00eda el siguiente:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ business logic code\n} catch (exception) {\n    if (exception instanceof TypeError) {\n        \/\/ do something\n    } else if (exception instanceof RangeError) {\n        \/\/ do something else\n    }\n}<\/code><\/pre>\n<h4>finally<\/h4>\n<p>La palabra clave <code>finally<\/code> se usa para definir un bloque de c\u00f3digo que se ejecuta despu\u00e9s de gestionar un error. Este bloque se ejecuta despu\u00e9s de los bloques try y catch.<\/p>\n<p>Adem\u00e1s, el bloque finally se ejecutar\u00e1 independientemente del resultado de los otros dos bloques. Esto significa que aunque el bloque catch no pueda manejar el error por completo o se lance un error en el bloque catch, el int\u00e9rprete ejecutar\u00e1 el c\u00f3digo en el bloque finally antes de que el programa se bloquee.<\/p>\n<p>Para que se considere v\u00e1lido, el bloque try en JavaScript debe ir seguido de un bloque catch o de un bloque finally. Sin ninguno de ellos, el int\u00e9rprete lanzar\u00e1 un SyntaxError. Por lo tanto, aseg\u00farate de seguir tus bloques try con al menos uno de ellos cuando manejes los errores.<\/p>\n<h3>Maneja los Errores Globalmente con el M\u00e9todo onerror()<\/h3>\n<p>El m\u00e9todo <code>onerror()<\/code> est\u00e1 disponible para todos los elementos HTML para manejar cualquier error que pueda ocurrir con ellos. Por ejemplo, si una etiqueta <code>img<\/code> no puede encontrar la imagen cuya URL se especifica, dispara su m\u00e9todo onerror para permitir al usuario manejar el error.<\/p>\n<p>Lo normal es que proporciones otra URL de imagen en la llamada onerror para qu\u00e9 la etiqueta <code>img<\/code> pueda recurrir a ella. As\u00ed es como puedes hacerlo mediante JavaScript:<\/p>\n<pre><code class=\"language-js\">const image = document.querySelector(\"img\")\n\nimage.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Sin embargo, puedes utilizar esta funci\u00f3n para crear un mecanismo global de gesti\u00f3n de errores para tu aplicaci\u00f3n. As\u00ed es como puedes hacerlo:<\/p>\n<pre><code class=\"language-js\">window.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Con este manejador de eventos, puedes deshacerte de los m\u00faltiples bloques <code>try...catch<\/code> que hay en tu c\u00f3digo y centralizar el manejo de errores de tu aplicaci\u00f3n de forma similar al manejo de eventos. Puedes adjuntar varios manejadores de errores a la ventana para mantener el principio de responsabilidad \u00fanica de los principios de dise\u00f1o SOLID. El int\u00e9rprete recorrer\u00e1 todos los manejadores hasta llegar al apropiado.<\/p>\n<h3>Pasar los Errores Mediante Devoluciones de Llamada<\/h3>\n<p>Mientras que las funciones simples y lineales permiten que el manejo de errores siga siendo sencillo, las devoluciones de llamada pueden complicar el asunto.<\/p>\n<p>Considera el siguiente fragmento de c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n    setTimeout(() =&gt; {\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ncalculateCube(4, callback)<\/code><\/pre>\n<p>La funci\u00f3n anterior demuestra una condici\u00f3n as\u00edncrona en la que una funci\u00f3n se toma un tiempo para procesar las operaciones y devuelve el resultado m\u00e1s tarde con la ayuda de una devoluci\u00f3n de llamada.<\/p>\n<p>Si intentas introducir una cadena en lugar de 4 en la llamada a la funci\u00f3n, obtendr\u00e1s como resultado <code>NaN<\/code>.<\/p>\n<p>Esto debe manejarse adecuadamente. He aqu\u00ed c\u00f3mo hacerlo:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\")\n            throw new Error(\"Numeric argument is expected\")\n\n        const cube = number * number * number\n        callback(cube)\n    }, 1000)\n}\n\nconst callback = result =&gt; console.log(result)\n\ntry {\n    calculateCube(4, callback)\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>Esto deber\u00eda resolver el problema idealmente. Sin embargo, si intentas pasar una cadena a la llamada de la funci\u00f3n, recibir\u00e1s esto:<\/p>\n<figure id=\"attachment_110236\" aria-describedby=\"caption-attachment-110236\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110236 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric-argument.png\" alt=\"The error \u201cUncaught Error: Numeric argument is expected\u201d shown on a dark red background beside a red cross icon.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110236\" class=\"wp-caption-text\">Ejemplo de error con un argumento equivocado.<\/figcaption><\/figure>\n<p>Aunque hayas implementado un bloque try-catch al llamar a la funci\u00f3n, sigue diciendo que el error es uncaught. El error se lanza despu\u00e9s de que se haya ejecutado el bloque catch debido al retardo del tiempo de espera.<\/p>\n<p>Esto puede ocurrir r\u00e1pidamente en las llamadas a la red, donde se producen retrasos inesperados. Es necesario que cubras estos casos mientras desarrollas tu aplicaci\u00f3n.<\/p>\n<p>A continuaci\u00f3n te explicamos c\u00f3mo puedes manejar los errores correctamente en las devoluciones de llamada:<\/p>\n<pre><code class=\"language-js\">const calculateCube = (number, callback) =&gt; {\n\n    setTimeout(() =&gt; {\n        if (typeof number !== \"number\") {\n            callback(new TypeError(\"Numeric argument is expected\"))\n            return\n        }\n        const cube = number * number * number\n        callback(null, cube)\n    }, 2000)\n}\n\nconst callback = (error, result) =&gt; {\n    if (error !== null) {\n        console.log(error)\n        return\n    }\n    console.log(result)\n}\n\ntry {\n    calculateCube('hey', callback)\n} catch (e) {\n    console.log(e)\n}<\/code><\/pre>\n<p>Ahora, la salida en la consola ser\u00e1:<\/p>\n<figure id=\"attachment_110238\" aria-describedby=\"caption-attachment-110238\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110238 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/type-error-numeric-dark.png\" alt=\"The message \u201cTypeError: Numeric argument is expected\u201d shown on a dark grey background.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110238\" class=\"wp-caption-text\">Ejemplo de TypeError con argumento ilegal.<\/figcaption><\/figure>\n<p>Esto indica que el error se ha gestionado adecuadamente.<\/p>\n<h3>Manejar los Errores en las Promesas<\/h3>\n<p>La mayor\u00eda de la gente tiende a preferir las promesas para manejar las actividades as\u00edncronas. Las promesas tienen otra ventaja: una promesa rechazada no termina tu script. Sin embargo, tienes que implementar un bloque catch para gestionar los errores en las promesas. Para entenderlo mejor, reescribamos la funci\u00f3n <code>calculateCube()<\/code> utilizando promesas:<\/p>\n<pre><code class=\"language-js\">const delay = ms =&gt; new Promise(res =&gt; setTimeout(res, ms));\n\nconst calculateCube = async (number) =&gt; {\n    if (typeof number !== \"number\")\n        throw Error(\"Numeric argument is expected\")\n    await delay(5000)\n    const cube = number * number * number\n    return cube\n}\n\ntry {\n    calculateCube(4).then(r =&gt; console.log(r))\n} catch (e) { console.log(e) }<\/code><\/pre>\n<p>El tiempo de espera del c\u00f3digo anterior se ha aislado en la funci\u00f3n <code>delay<\/code> para que se entienda. Si intentas introducir una cadena en lugar de 4, la salida que obtendr\u00e1s ser\u00e1 similar a esta<\/p>\n<figure id=\"attachment_110235\" aria-describedby=\"caption-attachment-110235\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110235 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/uncaught-error-numeric.png\" alt=\"The error \u201cUncaught (in promise) Error: Numeric argument is expected\u201d shown on a dark grey background beside a red cross icon.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110235\" class=\"wp-caption-text\">Ejemplo de TypeError con un argumento ilegal en Promise.<\/figcaption><\/figure>\n<p>De nuevo, esto se debe a que <code>Promise<\/code> lanza el error despu\u00e9s de que todo lo dem\u00e1s haya terminado de ejecutarse. La soluci\u00f3n a este problema es sencilla. Basta con a\u00f1adir una llamada a <code>catch()<\/code> a la cadena de la promesa, de la siguiente manera:<\/p>\n<pre><code class=\"language-js\">calculateCube(\"hey\")\n.then(r =&gt; console.log(r))\n.catch(e =&gt; console.log(e))<\/code><\/pre>\n<p>Ahora la salida ser\u00e1:<\/p>\n<figure id=\"attachment_110242\" aria-describedby=\"caption-attachment-110242\" style=\"width: 1100px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-110242 size-full\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2021\/11\/numeric-argument-error.png\" alt=\"The message \u201cError: Numeric argument is expected\u201d shown on a dark grey background.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110242\" class=\"wp-caption-text\">Ejemplo de TypeError con argumento ilegal<\/figcaption><\/figure>\n<p>Puedes observar lo f\u00e1cil que es manejar errores con promesas. Adem\u00e1s, puedes encadenar un bloque <code>finally()<\/code> y la llamada a la promesa para a\u00f1adir c\u00f3digo que se ejecutar\u00e1 una vez finalizada la gesti\u00f3n de errores.<\/p>\n<p>Alternativamente, tambi\u00e9n puedes manejar los errores en las promesas utilizando la t\u00e9cnica tradicional de try-catch-finally. As\u00ed es como se ver\u00eda tu llamada a la promesa en ese caso:<\/p>\n<pre><code class=\"language-js\">try {\n    let result = await calculateCube(\"hey\")\n    console.log(result)\n} catch (e) {\n    console.log(e)\n} finally {\n    console.log('Finally executed\")\n}<\/code><\/pre>\n<p>Sin embargo, esto solo funciona dentro de una funci\u00f3n as\u00edncrona. Por lo tanto, la forma preferida de manejar los errores en las promesas es encadenar <code>catch<\/code> y <code>finally<\/code> a la llamada a la promesa.<\/p>\n<h3>throw\/catch vs. onerror() vs. Callbacks vs. Promesas: \u00bfCu\u00e1l es el Mejor?<\/h3>\n<p>Con cuatro m\u00e9todos a tu disposici\u00f3n, debes saber elegir el m\u00e1s adecuado en cada caso de uso. A continuaci\u00f3n te explicamos c\u00f3mo pod\u00e9is decidir por vosotros mismos:<\/p>\n<h4>throw\/catch<\/h4>\n<p>Emplear\u00e1s este m\u00e9todo la mayor parte del tiempo. Aseg\u00farate de implementar condiciones para todos los posibles errores dentro de tu bloque catch, y recuerda incluir un bloque finally si necesitas ejecutar algunas rutinas de limpieza de memoria despu\u00e9s del bloque try.<\/p>\n<p>Sin embargo, demasiados bloques try\/catch pueden hacer que tu c\u00f3digo sea dif\u00edcil de mantener. Si te encuentras en una situaci\u00f3n as\u00ed, tal vez quieras manejar los errores a trav\u00e9s del manejador global o del m\u00e9todo promise.<\/p>\n<p>A la hora de decidir entre los bloques try\/catch as\u00edncronos y la promesa <code>catch()<\/code>, es aconsejable optar por los bloques try\/catch as\u00edncronos, ya que har\u00e1n que tu c\u00f3digo sea lineal y f\u00e1cil de depurar.<\/p>\n<h4>onerror()<\/h4>\n<p>Es mejor utilizar el m\u00e9todo <code>onerror()<\/code> cuando sepas que tu aplicaci\u00f3n tiene que manejar muchos errores, y que pueden estar bien dispersos por toda la base de c\u00f3digo. El m\u00e9todo <code>onerror<\/code> te permite manejar los errores como si fueran un evento m\u00e1s de tu aplicaci\u00f3n. Puedes definir varios manejadores de errores y adjuntarlos a la ventana de tu aplicaci\u00f3n en la renderizaci\u00f3n inicial.<\/p>\n<p>Sin embargo, tambi\u00e9n debes recordar que el m\u00e9todo <code>onerror()<\/code> puede ser innecesariamente dif\u00edcil de configurar en proyectos m\u00e1s peque\u00f1os con un alcance de error menor. Si est\u00e1s seguro de que tu aplicaci\u00f3n no arrojar\u00e1 demasiados errores, el m\u00e9todo tradicional throw\/catch te ir\u00e1 mejor.<\/p>\n<h4>Devoluciones de Llamadas y Promesas<\/h4>\n<p>El manejo de errores en las llamadas de retorno y las promesas difiere debido a su dise\u00f1o y estructura de c\u00f3digo. Sin embargo, si eliges entre estos dos antes de haber escrito tu c\u00f3digo, lo mejor ser\u00e1 optar por las promesas.<\/p>\n<p>Esto se debe a que las promesas tienen una construcci\u00f3n incorporada para encadenar un bloque <code>catch()<\/code> y otro <code>finally()<\/code> para manejar los errores f\u00e1cilmente. Este m\u00e9todo es m\u00e1s f\u00e1cil y limpio que definir argumentos adicionales\/reutilizar argumentos existentes para gestionar los errores.<\/p>\n<h3>Haz un Seguimiento de los Cambios con los Repositorios Git<\/h3>\n<p>Muchos errores suelen surgir debido a errores manuales en el c\u00f3digo base. Mientras desarrollas o depuras tu c\u00f3digo, puedes acabar haciendo cambios innecesarios que pueden provocar la aparici\u00f3n de nuevos errores en tu base de c\u00f3digo. <a href=\"https:\/\/kinsta.com\/es\/docs\/alojamiento-wordpress\/referencia-wordpress\/preguntas-frecuentes-tecnicas\/\">Las pruebas automatizadas<\/a> son una buena forma de mantener tu c\u00f3digo en orden despu\u00e9s de cada cambio. Sin embargo, solo puede decirte si algo est\u00e1 mal. Si no haces copias de seguridad frecuentes de tu c\u00f3digo, acabar\u00e1s perdiendo el tiempo intentando arreglar una funci\u00f3n o un script que antes funcionaba bien.<\/p>\n<p>Aqu\u00ed es donde git juega su papel. Con una estrategia de commit adecuada, puedes utilizar tu historial de git como sistema de copia de seguridad para ver tu c\u00f3digo a medida que evoluciona a trav\u00e9s del desarrollo. Puedes navegar f\u00e1cilmente a trav\u00e9s de tus commits m\u00e1s antiguos y encontrar la versi\u00f3n de la funci\u00f3n que funcionaba bien antes, pero que arroja errores despu\u00e9s de un cambio no relacionado.<\/p>\n<p>A continuaci\u00f3n, puedes restaurar el c\u00f3digo antiguo o comparar las dos versiones para determinar qu\u00e9 ha fallado. Las <a href=\"https:\/\/kinsta.com\/es\/blog\/herramientas-desarrollo-web\/\">herramientas modernas de desarrollo web<\/a>, como <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-github\/\">GitHub<\/a> Desktop o GitKraken, te ayudan a visualizar estos cambios uno al lado del otro y a descubrir los errores r\u00e1pidamente.<\/p>\n<p>Un h\u00e1bito que puede ayudarte a cometer menos errores es realizar <a href=\"https:\/\/kinsta.com\/es\/blog\/herramientas-de-revision-de-codigo\/\">revisiones de c\u00f3digo<\/a> cada vez que hagas un cambio significativo en tu c\u00f3digo. Si trabajas en equipo, puedes crear un pull request y hacer que un miembro del equipo lo revise a fondo. Esto te ayudar\u00e1 a utilizar un segundo par de ojos para detectar cualquier error que se te haya escapado.<\/p>\n<h2>Mejores Pr\u00e1cticas para Gestionar los Errores en JavaScript<\/h2>\n<p>Los m\u00e9todos mencionados anteriormente son adecuados para ayudarte a dise\u00f1ar un enfoque s\u00f3lido de gesti\u00f3n de errores para tu pr\u00f3xima aplicaci\u00f3n de JavaScript. Sin embargo, ser\u00eda mejor que tuvieras en cuenta algunas cosas mientras los implementas para obtener lo mejor de tu gesti\u00f3n de errores. Aqu\u00ed tienes algunos consejos que te ayudar\u00e1n.<\/p>\n<h3>1. Utiliza Errores Personalizados Cuando Manejes Excepciones Operativas<\/h3>\n<p>Hemos introducido los errores personalizados al principio de esta gu\u00eda para darte una idea de c\u00f3mo personalizar el manejo de errores al caso \u00fanico de tu aplicaci\u00f3n. Es aconsejable utilizar errores personalizados siempre que sea posible en lugar de la clase gen\u00e9rica <code>Error<\/code>, ya que proporciona m\u00e1s informaci\u00f3n contextual al entorno de llamada sobre el error.<\/p>\n<p>Adem\u00e1s, los errores personalizados te permiten moderar c\u00f3mo se muestra un error al entorno de llamada. Esto significa que puedes elegir ocultar detalles espec\u00edficos o mostrar informaci\u00f3n adicional sobre el error como y cuando quieras.<\/p>\n<p>Puedes llegar a formatear el contenido del error seg\u00fan tus necesidades. Esto te da un mejor control sobre c\u00f3mo se interpreta y maneja el error.<\/p>\n<h3>2. No te Tragues Ninguna Excepci\u00f3n<\/h3>\n<p>Incluso los desarrolladores m\u00e1s veteranos suelen cometer un error de novato: consumir niveles de excepciones en lo m\u00e1s profundo de su c\u00f3digo.<\/p>\n<p>Puedes encontrarte con situaciones en las que tienes un trozo de c\u00f3digo cuya ejecuci\u00f3n es opcional. Si funciona, genial; si no lo hace, no necesitas hacer nada al respecto.<\/p>\n<p>En estos casos, suele ser tentador poner este c\u00f3digo en un bloque try y adjuntarle un bloque catch vac\u00edo. Sin embargo, al hacer esto, dejar\u00e1s ese trozo de c\u00f3digo abierto para causar <i>cualquier<\/i> tipo de error y salirte con la tuya. Esto puede llegar a ser peligroso si tienes una base de c\u00f3digo grande y muchas instancias de estas construcciones de gesti\u00f3n de errores pobres.<\/p>\n<p>La mejor manera de gestionar las excepciones es determinar un nivel en el que se tratar\u00e1n todas ellas y levantarlas hasta all\u00ed. Este nivel puede ser un controlador (en una aplicaci\u00f3n con arquitectura MVC) o un middleware (en una aplicaci\u00f3n tradicional orientada al servidor).<\/p>\n<p>De este modo, sabr\u00e1s d\u00f3nde puedes encontrar todos los errores que se produzcan en tu app y elegir c\u00f3mo resolverlos, aunque eso signifique no hacer nada al respecto.<\/p>\n<h3>3. Utiliza una Estrategia Centralizada para los Registros y las Alertas de Error<\/h3>\n<p>El registro de un error suele ser una parte integral de su gesti\u00f3n. Los que no desarrollan una estrategia centralizada para registrar los errores pueden perder informaci\u00f3n valiosa sobre el uso de su aplicaci\u00f3n.<\/p>\n<p>Los registros de eventos de una aplicaci\u00f3n pueden ayudarte a averiguar datos cruciales sobre los errores y a depurarlos r\u00e1pidamente. Si tienes configurados mecanismos de alerta adecuados en tu aplicaci\u00f3n, puedes saber cu\u00e1ndo se produce un error en tu aplicaci\u00f3n antes de que llegue a una gran parte de tu base de usuarios.<\/p>\n<p>Es aconsejable utilizar un registrador pre-construido o crear uno que se adapte a tus necesidades. Puedes configurar este registrador para que gestione los errores en funci\u00f3n de sus niveles (advertencia, depuraci\u00f3n, informaci\u00f3n, etc.), y algunos registradores llegan incluso a enviar los registros a servidores de registro remotos inmediatamente. De este modo, puedes observar c\u00f3mo se comporta la l\u00f3gica de tu aplicaci\u00f3n con los usuarios activos.<\/p>\n<h3>4. Notifica los Errores a los Usuarios de Forma Adecuada<\/h3>\n<p>Otro buen punto que debes tener en cuenta al definir tu estrategia de gesti\u00f3n de errores es tener en cuenta al usuario.<\/p>\n<p>Todos los errores que interfieren en el funcionamiento normal de tu aplicaci\u00f3n deben presentar una alerta visible al usuario para notificarle que algo ha ido mal, de modo que pueda intentar encontrar una soluci\u00f3n. Si conoces una soluci\u00f3n r\u00e1pida para el error, como reintentar una operaci\u00f3n o cerrar la sesi\u00f3n y volver a iniciarla, aseg\u00farate de mencionarla en la alerta para ayudar a arreglar la experiencia del usuario en tiempo real.<\/p>\n<p>En el caso de errores que no causan ninguna interferencia con la experiencia diaria del usuario, puedes considerar la posibilidad de suprimir la alerta y registrar el error en un servidor remoto para resolverlo m\u00e1s tarde.<\/p>\n<h3>5. Implementa un Middleware (Node.js)<\/h3>\n<p>El <a href=\"https:\/\/kinsta.com\/es\/blog\/que-es-node-js\/\">entorno Node.js<\/a> admite middlewares para a\u00f1adir funcionalidades a las aplicaciones de servidor. Puedes utilizar esta funci\u00f3n para crear un middleware de gesti\u00f3n de errores para tu servidor.<\/p>\n<p>La ventaja m\u00e1s importante de utilizar un middleware es que todos tus errores se gestionan de forma centralizada en un solo lugar. Puedes optar por activar\/desactivar esta configuraci\u00f3n con fines de prueba f\u00e1cilmente.<\/p>\n<p>A continuaci\u00f3n te explicamos c\u00f3mo puedes crear un middleware b\u00e1sico:<\/p>\n<pre><code class=\"language-js\">const logError = err =&gt; {\n    console.log(\"ERROR: \" + String(err))\n}\n\nconst errorLoggerMiddleware = (err, req, res, next) =&gt; {\n    logError(err)\n    next(err)\n}\n\nconst returnErrorMiddleware = (err, req, res, next) =&gt; {\n    res.status(err.statusCode || 500)\n       .send(err.message)\n}\n\nmodule.exports = {\n    logError,\n    errorLoggerMiddleware,\n    returnErrorMiddleware\n}<\/code><\/pre>\n<p>A continuaci\u00f3n, puedes utilizar este middleware en tu aplicaci\u00f3n de la siguiente manera:<\/p>\n<pre><code class=\"language-js\">const { errorLoggerMiddleware, returnErrorMiddleware } = require('.\/errorMiddleware')\n\napp.use(errorLoggerMiddleware)\n\napp.use(returnErrorMiddleware)<\/code><\/pre>\n<p>Ahora puedes definir una l\u00f3gica personalizada dentro del middleware para manejar los errores adecuadamente. Ya no tienes que preocuparte de implementar construcciones individuales de gesti\u00f3n de errores en toda tu base de c\u00f3digo.<\/p>\n<h3>6. Reinicia tu Aplicaci\u00f3n para Gestionar los Errores de Programaci\u00f3n (Node.js)<\/h3>\n<p>Cuando las aplicaciones Node.js se encuentran con errores de programaci\u00f3n, no necesariamente lanzan una excepci\u00f3n e intentan cerrar la aplicaci\u00f3n. Estos errores pueden incluir problemas derivados de los errores del programador, como un alto consumo de CPU, hinchaz\u00f3n de memoria o fugas de memoria. La mejor manera de manejarlos es reiniciar la aplicaci\u00f3n de forma elegante, cerr\u00e1ndola a trav\u00e9s del modo de cl\u00faster de Node.js o de una herramienta \u00fanica como PM2. Esto puede asegurar que la aplicaci\u00f3n no se bloquee tras la acci\u00f3n del usuario, presentando una experiencia de usuario terrible.<\/p>\n<h3>7. Atrapar Todas las Excepciones no Capturadas (Node.js)<\/h3>\n<p>Nunca puedes estar seguro de haber cubierto todos los posibles errores que puedan ocurrir en tu aplicaci\u00f3n. Por lo tanto, es esencial que implementes una estrategia de reserva para atrapar todas las excepciones no capturadas de tu aplicaci\u00f3n.<\/p>\n<p>He aqu\u00ed c\u00f3mo puedes hacerlo:<\/p>\n<pre><code class=\"language-js\">process.on('uncaughtException', error =&gt; {\n    console.log(\"ERROR: \" + String(error))\n    \/\/ other handling mechanisms\n})<\/code><\/pre>\n<p>Tambi\u00e9n puedes identificar si el error que se ha producido es una excepci\u00f3n est\u00e1ndar o un error operativo personalizado. En funci\u00f3n del resultado, puedes salir del proceso y reiniciarlo para evitar un comportamiento inesperado.<\/p>\n<h3>8. Atrapar Todos los Rechazos de Promesas no Manejadas (Node.js)<\/h3>\n<p>De forma similar a como nunca puedes cubrir todas las posibles excepciones, existe una alta probabilidad de que se te escape el manejo de todos los posibles rechazos de promesas. Sin embargo, a diferencia de las excepciones, los rechazos de promesas no lanzan errores.<\/p>\n<p>Por tanto, una promesa importante que haya sido rechazada podr\u00eda pasar desapercibida como advertencia y dejar tu aplicaci\u00f3n expuesta a la posibilidad de encontrarse con un comportamiento inesperado. Por lo tanto, es crucial implementar un mecanismo de retroceso para manejar el rechazo de promesas.<\/p>\n<p>He aqu\u00ed c\u00f3mo puedes hacerlo:<\/p>\n<pre><code class=\"language-js\">const promiseRejectionCallback = error =&gt; {\n    console.log(\"PROMISE REJECTED: \" + String(error))\n}\n\nprocess.on('unhandledRejection', callback)<\/code><\/pre>\n\n<h2>Resumen<\/h2>\n<p>Como en cualquier otro lenguaje de programaci\u00f3n, los errores son bastante frecuentes y naturales en JavaScript. En algunos casos, incluso puedes necesitar lanzar errores intencionadamente para indicar la respuesta correcta a tus usuarios. Por ello, es fundamental entender su anatom\u00eda y sus tipos.<\/p>\n<p>Adem\u00e1s, debes estar equipado con las herramientas y t\u00e9cnicas adecuadas para identificar y evitar que los errores acaben con tu aplicaci\u00f3n.<\/p>\n<p>En la mayor\u00eda de los casos, una estrategia s\u00f3lida para manejar los errores con una ejecuci\u00f3n cuidadosa es suficiente para todo tipo de aplicaciones JavaScript.<\/p>\n<p><em>\u00bfHay alg\u00fan otro error de JavaScript que a\u00fan no hayas podido resolver? \u00bfAlguna t\u00e9cnica para manejar los errores de JS de forma constructiva? \u00a1H\u00e1znoslo saber en los comentarios de abajo!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>La ley de Murphy afirma que todo lo que puede salir mal, acabar\u00e1 saliendo mal. Esto se aplica demasiado bien en el mundo de la programaci\u00f3n. &#8230;<\/p>\n","protected":false},"author":238,"featured_media":47294,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[856,867,414],"topic":[1295],"class_list":["post-47293","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-development","tag-javascript","tag-webdev","topic-errores-javascript"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Gu\u00eda Definitiva para el Manejo de Errores en JavaScript<\/title>\n<meta name=\"description\" content=\"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript\" \/>\n<meta property=\"og:description\" content=\"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinsta.es\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-08T13:07:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-21T12:46:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kumar Harsh\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:site\" content=\"@Kinsta_ES\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"35 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript\",\"datePublished\":\"2022-02-08T13:07:03+00:00\",\"dateModified\":\"2023-08-21T12:46:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\"},\"wordCount\":6949,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg\",\"keywords\":[\"development\",\"JavaScript\",\"webdev\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\",\"url\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\",\"name\":\"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/es\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg\",\"datePublished\":\"2022-02-08T13:07:03+00:00\",\"dateModified\":\"2023-08-21T12:46:15+00:00\",\"description\":\"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg\",\"width\":1460,\"height\":730,\"caption\":\"Gu\u00eda definitiva para el manejo de errores en JavaScript\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Errores Javascript\",\"item\":\"https:\/\/kinsta.com\/es\/secciones\/errores-javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/es\/#website\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Soluciones de alojamiento premium, r\u00e1pidas y seguras\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/es\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/es\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/es\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinsta.es\/\",\"https:\/\/x.com\/Kinsta_ES\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g\",\"caption\":\"Kumar Harsh\"},\"description\":\"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.\",\"sameAs\":[\"https:\/\/kumarharsh.me\"],\"url\":\"https:\/\/kinsta.com\/es\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript","description":"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/","og_locale":"es_ES","og_type":"article","og_title":"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript","og_description":"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.","og_url":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinsta.es\/","article_published_time":"2022-02-08T13:07:03+00:00","article_modified_time":"2023-08-21T12:46:15+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.","twitter_image":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg","twitter_creator":"@Kinsta_ES","twitter_site":"@Kinsta_ES","twitter_misc":{"Escrito por":"Kumar Harsh","Tiempo de lectura":"35 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript","datePublished":"2022-02-08T13:07:03+00:00","dateModified":"2023-08-21T12:46:15+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/"},"wordCount":6949,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg","keywords":["development","JavaScript","webdev"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/","url":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/","name":"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript","isPartOf":{"@id":"https:\/\/kinsta.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg","datePublished":"2022-02-08T13:07:03+00:00","dateModified":"2023-08-21T12:46:15+00:00","description":"\u00bfTe encuentras con errores en tu JavaScript? Te mostraremos c\u00f3mo controlar esos errores para que puedas volver a desarrollar tu proyecto.","breadcrumb":{"@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#primaryimage","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2022\/01\/errors-in-javascript.jpg","width":1460,"height":730,"caption":"Gu\u00eda definitiva para el manejo de errores en JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/es\/blog\/errores-en-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/es\/"},{"@type":"ListItem","position":2,"name":"Errores Javascript","item":"https:\/\/kinsta.com\/es\/secciones\/errores-javascript\/"},{"@type":"ListItem","position":3,"name":"Gu\u00eda Definitiva para el Manejo de Errores en JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/es\/#website","url":"https:\/\/kinsta.com\/es\/","name":"Kinsta\u00ae","description":"Soluciones de alojamiento premium, r\u00e1pidas y seguras","publisher":{"@id":"https:\/\/kinsta.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/es\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/es\/wp-content\/uploads\/sites\/8\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinsta.es\/","https:\/\/x.com\/Kinsta_ES","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/kinsta.com\/es\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de2d8d6273bdcc3dfa2f8270428f95b2?s=96&d=mm&r=g","caption":"Kumar Harsh"},"description":"Kumar is a software developer and a technical author based in India. He specializes in JavaScript and DevOps. You can learn more about his work on his website.","sameAs":["https:\/\/kumarharsh.me"],"url":"https:\/\/kinsta.com\/es\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/47293","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/comments?post=47293"}],"version-history":[{"count":16,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/47293\/revisions"}],"predecessor-version":[{"id":56469,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/posts\/47293\/revisions\/56469"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/de"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/translations\/jp"},{"href":"https:\/\/kinsta.com\/es\/wp-json\/kinsta\/v1\/posts\/47293\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media\/47294"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/media?parent=47293"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/tags?post=47293"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/es\/wp-json\/wp\/v2\/topic?post=47293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}