{"id":46542,"date":"2022-02-03T11:51:05","date_gmt":"2022-02-03T14:51:05","guid":{"rendered":"https:\/\/kinsta.com\/pt\/?p=46542&#038;preview=true&#038;preview_id=46542"},"modified":"2023-08-22T03:32:17","modified_gmt":"2023-08-22T06:32:17","slug":"erros-no-javascript","status":"publish","type":"post","link":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/","title":{"rendered":"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript"},"content":{"rendered":"<p>A lei de Murphy diz que tudo que pode dar errado eventualmente dar\u00e1 errado. Isto se aplica um pouco bem demais no mundo da programa\u00e7\u00e3o. Se voc\u00ea criar um aplicativo, \u00e9 prov\u00e1vel que voc\u00ea crie bugs e outros problemas. Erros no JavaScript s\u00e3o um desses problemas comuns!<\/p>\n<p>O sucesso de um produto de software depende de qu\u00e3o bem seus criadores podem resolver esses problemas antes de prejudicar seus usu\u00e1rios. E o <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-javascript\/\">JavaScript<\/a>, de todas as <a href=\"https:\/\/kinsta.com\/pt\/blog\/melhor-linguagem-de-programacao\/\">linguagens de programa\u00e7\u00e3o<\/a>, \u00e9 not\u00f3rio por seu design de manipula\u00e7\u00e3o de erros m\u00e9dio.<\/p>\n<p>Se voc\u00ea estiver <a href=\"https:\/\/kinsta.com\/pt\/blog\/bibliotecas-javascript\/\">construindo um aplicativo JavaScript<\/a>, h\u00e1 uma grande chance de voc\u00ea mexer com tipos de dados em um ponto ou outro. Se n\u00e3o for isso, ent\u00e3o voc\u00ea pode acabar substituindo um operador <i>indefinido <\/i>por um operador <i>nulo<\/i> ou triplo igual (<code>===<\/code>) por um operador duplo igual (<code>==<\/code>).<\/p>\n<p>\u00c9 humano apenas cometer erros. \u00c9 por isso que vamos mostrar a voc\u00ea tudo o que voc\u00ea precisa saber sobre como lidar com erros no JavaScript.<\/p>\n<p>Este artigo ir\u00e1 gui\u00e1-lo atrav\u00e9s dos erros b\u00e1sicos no JavaScript e explicar os v\u00e1rios erros que voc\u00ea pode encontrar. Voc\u00ea aprender\u00e1 ent\u00e3o como identificar e corrigir esses erros. H\u00e1 tamb\u00e9m algumas dicas para lidar com os erros de forma eficaz em ambientes de produ\u00e7\u00e3o.<\/p>\n<p>Sem mais delongas, vamos come\u00e7ar!<\/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>Confira nosso guia em v\u00eddeo para <a href=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\">lidar com erros de JavaScript<\/a><\/h3>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=CQzwi9_7wHI\"><\/kinsta-video>\n<h2>O que s\u00e3o erros no JavaScript?<\/h2>\n<p>Os erros na programa\u00e7\u00e3o referem-se a situa\u00e7\u00f5es que n\u00e3o permitem que um programa funcione normalmente. Pode acontecer quando um programa n\u00e3o sabe como lidar com o trabalho em quest\u00e3o, como quando se tenta abrir um arquivo inexistente ou alcan\u00e7ar um endpoint API baseado na web enquanto n\u00e3o h\u00e1 conectividade de rede.<\/p>\n<p>Estas situa\u00e7\u00f5es empurram o programa para lan\u00e7ar erros ao usu\u00e1rio, afirmando que ele n\u00e3o sabe como proceder. O programa coleta o m\u00e1ximo de informa\u00e7\u00f5es poss\u00edveis sobre o erro e ent\u00e3o relata que n\u00e3o pode avan\u00e7ar.<\/p>\n\n<p>Programadores inteligentes tentam prever e cobrir estes cen\u00e1rios para que o usu\u00e1rio n\u00e3o tenha que descobrir uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/lista-codigos-status-http\/\">mensagem de erro t\u00e9cnico como &#8220;404&#8221;<\/a> independentemente. Ao inv\u00e9s disso, eles mostram uma mensagem muito mais compreens\u00edvel: &#8220;A p\u00e1gina n\u00e3o p\u00f4de ser encontrada&#8221;<\/p>\n<p>Os erros no JavaScript s\u00e3o objetos mostrados sempre que ocorre um erro de programa\u00e7\u00e3o. Estes objetos cont\u00eam amplas informa\u00e7\u00f5es sobre o tipo do erro, a declara\u00e7\u00e3o que causou o erro e o tra\u00e7o da pilha quando o erro ocorreu. O JavaScript tamb\u00e9m permite que os programadores criem erros personalizados para fornecer informa\u00e7\u00f5es extras ao depurar problemas.<\/p>\n<h3>Propriedades de um erro<\/h3>\n<p>Agora que a defini\u00e7\u00e3o de um erro de JavaScript est\u00e1 clara, \u00e9 hora de mergulhar nos detalhes.<\/p>\n<p>Os erros no JavaScript carregam certas propriedades padr\u00e3o e personalizadas que ajudam a entender a causa e os efeitos do erro. Por padr\u00e3o, os erros no JavaScript cont\u00eam tr\u00eas propriedades:<\/p>\n<ol>\n<li><b>message<\/b>: Um valor de string que carrega a mensagem de erro<\/li>\n<li><b>name<\/b>: O tipo de erro que ocorreu (Vamos mergulhar fundo nisto na pr\u00f3xima se\u00e7\u00e3o)<\/li>\n<li><b>stack<\/b>: O rastreamento da pilha do c\u00f3digo executado quando o erro ocorreu.<\/li>\n<\/ol>\n<p>Al\u00e9m disso, erros tamb\u00e9m podem conter propriedades como <i>columnNumber, lineNumber, fileName, <\/i>etc., para descrever melhor o erro. Entretanto, essas propriedades n\u00e3o s\u00e3o padr\u00e3o e podem ou n\u00e3o estar presentes em todos os objetos de erro gerados a partir do seu aplicativo JavaScript.<\/p>\n<h3>Entendendo o rastreamento de pilha (stacktrace)<\/h3>\n<p>Um rastreamento de pilha \u00e9 a lista de chamadas de m\u00e9todo em que um programa estava quando um evento como uma exce\u00e7\u00e3o ou um aviso ocorre. \u00c9 assim que uma amostra de rastreamento de pilha acompanhada por uma exce\u00e7\u00e3o se parece:<\/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=\"Exemplo de um Stack Trace\" width=\"1138\" height=\"278\"><figcaption id=\"caption-attachment-110237\" class=\"wp-caption-text\">Exemplo de um Stack Trace<\/figcaption><\/figure>\n<p>Como voc\u00ea pode ver, ele come\u00e7a imprimindo o nome e a mensagem de erro, seguido por uma lista de m\u00e9todos que estavam sendo chamados. Cada chamada de m\u00e9todo declara a localiza\u00e7\u00e3o do seu c\u00f3digo fonte e a linha na qual ele foi invocado. Voc\u00ea pode usar estes dados para navegar atrav\u00e9s de sua base de c\u00f3digo e identificar qual parte do c\u00f3digo est\u00e1 causando o erro.<\/p>\n<p>Esta lista de m\u00e9todos \u00e9 organizada de forma empilhada. Ela mostra onde a sua exce\u00e7\u00e3o foi lan\u00e7ada pela primeira vez e como ela se propagou atrav\u00e9s das chamadas do m\u00e9todo empilhado. A implementa\u00e7\u00e3o de um catch para a exce\u00e7\u00e3o n\u00e3o deixar\u00e1 que ela se propague atrav\u00e9s da pilha e trave seu programa. No entanto, voc\u00ea pode querer deixar erros fatais sem causar danos para travar o programa em alguns cen\u00e1rios intencionalmente.<\/p>\n<h3>Erros vs Exce\u00e7\u00f5es<\/h3>\n<p>A maioria das pessoas normalmente considera erros e exce\u00e7\u00f5es como a mesma coisa. Entretanto, \u00e9 essencial notar uma pequena mas fundamental diferen\u00e7a entre eles.<\/p>\n<aside role=\"note\" class=\"wp-block-kinsta-notice is-style-info\">\n            <h3>Info<\/h3>\n        <p>Uma exce\u00e7\u00e3o \u00e9 um objeto de erro que foi lan\u00e7ado.<\/p>\n<\/aside>\n\n<p>Para entender isso melhor, vamos dar um exemplo r\u00e1pido. Aqui est\u00e1 como voc\u00ea pode definir um erro no JavaScript:<\/p>\n<pre><code class=\"language-js\">const wrongTypeError = TypeError(\"Wrong type found, expected character\")<code><\/code><\/code><\/pre>\n<p>E \u00e9 assim que o <code><i>wrongTypeError<\/i><\/code> objeto se torna uma exce\u00e7\u00e3o:<\/p>\n<pre><code class=\"language-js\">throw wrongTypeError<\/code><\/pre>\n<p>Entretanto, a maioria das pessoas tende a usar a forma abreviada que define os objetos de erro enquanto os atira:<\/p>\n<pre><code class=\"language-js\">throw TypeError(\"Wrong type found, expected character\")<\/code><\/pre>\n<p>Esta \u00e9 uma pr\u00e1tica padr\u00e3o. Entretanto, \u00e9 uma das raz\u00f5es pelas quais os desenvolvedores tendem a misturar exce\u00e7\u00f5es e erros. Portanto, conhecer os fundamentos \u00e9 vital, mesmo que voc\u00ea use o uso de taquigrafia para fazer o seu trabalho rapidamente.<\/p>\n<h2>Tipos de erros no JavaScript<\/h2>\n<p>H\u00e1 uma gama de tipos de erros predefinidos no JavaScript. Eles s\u00e3o automaticamente escolhidos e definidos pelo JavaScript runtime sempre que o programador n\u00e3o lida explicitamente com erros no aplicativo.<\/p>\n<p>Esta se\u00e7\u00e3o vai gui\u00e1-lo atrav\u00e9s de alguns dos tipos mais comuns de erros no JavaScript e entender quando e porque eles ocorrem.<\/p>\n<h3>RangeError<\/h3>\n<p>Um RangeError \u00e9 lan\u00e7ado quando uma vari\u00e1vel \u00e9 definida com um valor fora de sua faixa de valores legais. Normalmente ocorre quando se passa um valor como argumento para uma fun\u00e7\u00e3o, e o valor dado n\u00e3o se encontra no intervalo dos par\u00e2metros da fun\u00e7\u00e3o. \u00c0s vezes pode ser complicado corrigir quando se usa bibliotecas de terceiros mal documentadas, j\u00e1 que voc\u00ea precisa conhecer o intervalo de valores poss\u00edveis para que os argumentos passem no valor correto.<\/p>\n<p>Alguns dos cen\u00e1rios comuns em que o RangeError ocorre s\u00e3o:<\/p>\n<ul>\n<li>Tentando criar um array de comprimentos ilegais atrav\u00e9s do construtor do Array.<\/li>\n<li>Passando valores ruins para m\u00e9todos num\u00e9ricos como <code>toExponential()<\/code>, <code>toPrecision()<\/code>, <code>toFixed()<\/code>, etc.<\/li>\n<li>Passando valores ilegais para fun\u00e7\u00f5es de string como <code>normalize()<\/code>.<\/li>\n<\/ul>\n<h3 id=\"referenceerror\" class=\"has-anchor-hash\">ReferenceError<\/h3>\n<p>Um ReferenceError ocorre quando algo est\u00e1 errado com a refer\u00eancia de uma vari\u00e1vel em seu c\u00f3digo. Voc\u00ea pode ter esquecido de definir um valor para a vari\u00e1vel antes de us\u00e1-la, ou pode estar tentando usar uma vari\u00e1vel inacess\u00edvel em seu c\u00f3digo. De qualquer forma, passar pelo rastreamento de pilha fornece amplas informa\u00e7\u00f5es para encontrar e corrigir a refer\u00eancia da vari\u00e1vel que est\u00e1 em falta.<\/p>\n<p>Algumas das raz\u00f5es comuns pelas quais os ReferenceErrors ocorrem s\u00e3o:<\/p>\n<ul>\n<li>Fazendo um erro de digita\u00e7\u00e3o em um nome da vari\u00e1vel.<\/li>\n<li>Tentando acessar vari\u00e1veis em bloco fora de seus escopos.<\/li>\n<li>Referenciar uma vari\u00e1vel global de uma biblioteca externa (como <a href=\"https:\/\/kinsta.com\/pt\/blog\/jquery-nao-esta-definido\/\">$ de jQuery<\/a>) antes que ela seja carregada.<\/li>\n<\/ul>\n<h3>SintaxError<\/h3>\n<p>Estes erros s\u00e3o dos mais simples de corrigir, pois indicam um erro na sintaxe do c\u00f3digo. Como o JavaScript \u00e9 uma <a href=\"https:\/\/kinsta.com\/pt\/blog\/linguagens-de-script\/\">linguagem de script<\/a> que \u00e9 interpretada ao inv\u00e9s de compilada, estes s\u00e3o lan\u00e7ados quando o aplicativo executa o script que cont\u00e9m o erro. No caso de linguagens compiladas, tais erros s\u00e3o identificados durante a compila\u00e7\u00e3o. Assim, os bin\u00e1rios da app n\u00e3o s\u00e3o criados at\u00e9 que estes sejam corrigidos.<\/p>\n<p>Algumas das raz\u00f5es comuns pelas quais os SyntaxErrors podem ocorrer s\u00e3o:<\/p>\n<ul>\n<li>Faltando v\u00edrgulas invertidas<\/li>\n<li>Par\u00eanteses de fechamento ausentes<\/li>\n<li>Alinhamento impr\u00f3prio de suportes de carac\u00f3is ou outros caracteres<\/li>\n<\/ul>\n<p>\u00c9 uma boa pr\u00e1tica usar uma ferramenta de impress\u00e3o em sua IDE para identificar tais erros para voc\u00ea antes que eles cheguem ao navegador.<\/p>\n<h3>TypeError<\/h3>\n<p>TypeError \u00e9 um dos erros mais comuns em aplicativos JavaScript. Este erro \u00e9 criado quando algum valor n\u00e3o se revela de um tipo espec\u00edfico esperado. Alguns dos casos comuns quando ele ocorre s\u00e3o:<\/p>\n<ul>\n<li>Invocando objetos que n\u00e3o s\u00e3o m\u00e9todos.<\/li>\n<li>Tentativa de acessar propriedades de objetos nulos ou indefinidos<\/li>\n<li>Tratar um string\u00a0como um n\u00famero ou vice versa<\/li>\n<\/ul>\n<p>H\u00e1 muito mais possibilidades onde um TypeError pode ocorrer. Vamos olhar para algumas inst\u00e2ncias famosas mais tarde e aprender como consert\u00e1-las.<\/p>\n<h3>InternalError<\/h3>\n<p>O tipo InternalError \u00e9 usado quando ocorre uma exce\u00e7\u00e3o no motor em tempo de execu\u00e7\u00e3o JavaScript. Ele pode ou n\u00e3o indicar um problema com o seu c\u00f3digo.<\/p>\n<p>Na maioria das vezes, o InternalError ocorre apenas em dois cen\u00e1rios:<\/p>\n<ul>\n<li>Quando um patch ou uma atualiza\u00e7\u00e3o do tempo de execu\u00e7\u00e3o do JavaScript traz um bug que lan\u00e7a exce\u00e7\u00f5es (isso acontece muito raramente)<\/li>\n<li>Quando seu c\u00f3digo cont\u00e9m entidades que s\u00e3o muito grandes para o mecanismo JavaScript (por exemplo, muitos casos de switch, inicializadores de array muito grandes, demasiada recorr\u00eancia)<\/li>\n<\/ul>\n<p>A abordagem mais apropriada para resolver este erro \u00e9 identificar a causa atrav\u00e9s da mensagem de erro e reestruturar sua l\u00f3gica do aplicativo, se poss\u00edvel, para eliminar o pico repentino de carga de trabalho no mecanismo JavaScript.<\/p>\n<h3>URIError<\/h3>\n<p>O URIError ocorre quando uma fun\u00e7\u00e3o global de manuseio de URI, como <code>decodeURIComponent<\/code>, \u00e9 usada ilegalmente. Ele normalmente indica que o par\u00e2metro passado para a chamada do m\u00e9todo n\u00e3o estava de acordo com os padr\u00f5es URI e, portanto, n\u00e3o foi <a href=\"https:\/\/kinsta.com\/pt\/blog\/adiar-a-analise-de-aviso-do-javascript\/\">analisado corretamente pelo m\u00e9todo<\/a>.<\/p>\n<p>Diagnosticar esses erros geralmente \u00e9 f\u00e1cil, uma vez que voc\u00ea s\u00f3 precisa examinar os argumentos para a m\u00e1-forma\u00e7\u00e3o.<\/p>\n<h3>EvalError<\/h3>\n<p>Um EvalError ocorre quando ocorre um erro com uma chamada de fun\u00e7\u00e3o <code>eval()<\/code>. A fun\u00e7\u00e3o <code>eval()<\/code> \u00e9 usada para executar c\u00f3digo JavaScript armazenado em strings. Entretanto, como o uso da fun\u00e7\u00e3o <code>eval()<\/code> \u00e9 altamente desencorajado devido a problemas de seguran\u00e7a e as especifica\u00e7\u00f5es atuais do ECMAScript n\u00e3o jogam mais a classe <code>EvalError<\/code>, este tipo de erro existe simplesmente para manter a compatibilidade retroativa com o c\u00f3digo JavaScript antigo.<\/p>\n<p>Se voc\u00ea estiver trabalhando em uma vers\u00e3o antiga do JavaScript, voc\u00ea pode encontrar este erro. Em qualquer caso, \u00e9 melhor investigar o c\u00f3digo executado na chamada de fun\u00e7\u00e3o <code>eval()<\/code> para qualquer exce\u00e7\u00e3o.<\/p>\n<h2>Criando tipos de erros personalizados<\/h2>\n<p>Enquanto o JavaScript oferece uma lista adequada de classes de tipo de erro para cobrir a maioria dos cen\u00e1rios, voc\u00ea sempre pode criar um novo tipo de erro se a lista n\u00e3o satisfizer suas exig\u00eancias. A base desta flexibilidade est\u00e1 no fato de que o JavaScript permite que voc\u00ea lance qualquer coisa literalmente com o comando <code>throw<\/code>.<\/p>\n<p>Portanto, tecnicamente, estas declara\u00e7\u00f5es s\u00e3o inteiramente legais:<\/p>\n<pre><code class=\"language-js\">throw 8\nthrow \"An error occurred\"<\/code><\/pre>\n<p>Entretanto, lan\u00e7ar um tipo de dado primitivo n\u00e3o fornece detalhes sobre o erro, tais como seu tipo, nome ou o rastreamento de pilha que o acompanha. Para corrigir isso e padronizar o processo de gerenciamento de erros, a classe <code>Error<\/code> foi fornecida. Tamb\u00e9m \u00e9 desencorajado o uso de tipos de dados primitivos enquanto se lan\u00e7am exce\u00e7\u00f5es.<\/p>\n<p>Voc\u00ea pode estender a classe <code>Error<\/code> para criar sua classe de erro personalizada. Aqui est\u00e1 um exemplo b\u00e1sico de como voc\u00ea pode fazer isso:<\/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>E voc\u00ea pode us\u00e1-lo da seguinte maneira:<\/p>\n<pre><code class=\"language-js\">throw ValidationError(\"Property not found: name\")<\/code><\/pre>\n<p>E voc\u00ea pode ent\u00e3o identific\u00e1-lo usando a palavra-chave <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>Os 10 erros mais comuns no JavaScript<\/h2>\n<p>Agora que voc\u00ea entende os tipos de erros comuns e como criar seus erros personalizados, \u00e9 hora de olhar para alguns dos erros mais comuns que voc\u00ea vai enfrentar ao escrever c\u00f3digo JavaScript.<\/p>\n<h3>1. Uncaught RangeError<\/h3>\n<p>Este erro ocorre no Google Chrome em alguns cen\u00e1rios diferentes. Primeiro, ele pode acontecer se voc\u00ea chamar uma fun\u00e7\u00e3o recursiva e ela n\u00e3o terminar. Voc\u00ea mesmo pode verificar isso no Console do Desenvolvedor do 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=\"Exemplo do RangeError com uma chamada recursiva de fun\u00e7\u00e3o.\" width=\"1392\" height=\"492\"><figcaption id=\"caption-attachment-110241\" class=\"wp-caption-text\">Exemplo do RangeError com uma chamada recursiva de fun\u00e7\u00e3o.<\/figcaption><\/figure>\n<p>Portanto, para resolver tal erro, certifique-se de definir corretamente os casos limite da sua fun\u00e7\u00e3o recursiva. Outra raz\u00e3o pela qual este erro ocorre \u00e9 que voc\u00ea passou um valor que est\u00e1 fora da faixa de par\u00e2metros de uma fun\u00e7\u00e3o. Aqui est\u00e1 um exemplo:<\/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=\"Exemplo do RangeError com a chamada toExponential().\" width=\"1392\" height=\"150\"><figcaption id=\"caption-attachment-110239\" class=\"wp-caption-text\">Exemplo do RangeError com a chamada toExponential().<\/figcaption><\/figure>\n<p>A mensagem de erro normalmente indicar\u00e1 o que est\u00e1 errado com o seu c\u00f3digo. Uma vez que voc\u00ea fizer as mudan\u00e7as, ele ser\u00e1 resolvido.<\/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=\"Resultado para a chamada de fun\u00e7\u00e3o toExponential().\" width=\"1396\" height=\"100\"><figcaption id=\"caption-attachment-110240\" class=\"wp-caption-text\">Resultado para a chamada de fun\u00e7\u00e3o toExponential().<\/figcaption><\/figure>\n<h3>2. Uncaught TypeError: Cannot set property<\/h3>\n<p>Este erro ocorre quando voc\u00ea define uma propriedade em uma refer\u00eancia indefinida. Voc\u00ea pode reproduzir o problema com este c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">var list\nlist.count = 0<code><\/code><\/code><\/pre>\n<p>Este \u00e9 o resultado que voc\u00ea receber\u00e1:<\/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=\"Exemplo do TypeError.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110245\" class=\"wp-caption-text\">Exemplo do TypeError.<\/figcaption><\/figure>\n<p>Para corrigir este erro, inicialize a refer\u00eancia com um valor antes de acessar suas propriedades. Veja como ele fica quando corrigido:<\/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=\"Como resolver o TypeError.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110246\" class=\"wp-caption-text\">Como resolver o TypeError.<\/figcaption><\/figure>\n<h3>3. Uncaught TypeError: Cannot read property<\/h3>\n<p>Este \u00e9 um dos erros mais frequentes no JavaScript. Este erro ocorre quando voc\u00ea tenta ler uma propriedade ou chamar uma fun\u00e7\u00e3o em um objeto indefinido. Voc\u00ea pode reproduzi-lo muito facilmente executando o seguinte c\u00f3digo em um console do Chrome Developer:<\/p>\n<pre><code class=\"language-js\">var func\nfunc.call()<code><\/code><\/code><\/pre>\n<p>Aqui est\u00e1 o 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=\"TypeError exemplo com fun\u00e7\u00e3o indefinida.\" width=\"1100\" height=\"162\"><figcaption id=\"caption-attachment-110249\" class=\"wp-caption-text\">TypeError exemplo com fun\u00e7\u00e3o indefinida.<\/figcaption><\/figure>\n<p>Um objeto indefinido \u00e9 uma das muitas causas poss\u00edveis deste erro. Outra causa proeminente desta quest\u00e3o pode ser uma inicializa\u00e7\u00e3o impr\u00f3pria do estado enquanto se processa a IU. Aqui est\u00e1 um exemplo do mundo real de um aplicativo 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>O aplicativo come\u00e7a com um cont\u00eainer de estado vazio e \u00e9 fornecido com alguns itens ap\u00f3s um atraso de 2 segundos. O atraso \u00e9 colocado em pr\u00e1tica para imitar uma chamada de rede. Mesmo que sua rede seja super r\u00e1pida, voc\u00ea ainda enfrentar\u00e1 um pequeno atraso devido ao qual o componente ir\u00e1 render pelo menos uma vez. Se voc\u00ea tentar executar este aplicativo, voc\u00ea receber\u00e1 o seguinte erro:<\/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=\"TypeError stack trace em um navegador.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110234\" class=\"wp-caption-text\">TypeError stack trace em um navegador.<\/figcaption><\/figure>\n<p>Isto porque, no momento da renderiza\u00e7\u00e3o, o cont\u00eainer estatal \u00e9 indefinido; portanto, n\u00e3o existe nenhuma propriedade <code>items<\/code> sobre ele. A corre\u00e7\u00e3o deste erro \u00e9 f\u00e1cil. Voc\u00ea s\u00f3 precisa fornecer um valor inicial padr\u00e3o para o cont\u00eainer estadual.<\/p>\n<pre><code class=\"language-js\">\/\/ ...\nconst [state, setState] = useState({items: []});\n\/\/ ...<\/code><\/pre>\n<p>Agora, ap\u00f3s o atraso definido, seu aplicativo mostrar\u00e1 uma resultado semelhante a este aqui:<\/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=\"Resultado do c\u00f3digo.\" width=\"1180\" height=\"576\"><figcaption id=\"caption-attachment-110251\" class=\"wp-caption-text\">Resultado do c\u00f3digo.<\/figcaption><\/figure>\n<p>A corre\u00e7\u00e3o exata em seu c\u00f3digo pode ser diferente, mas a ess\u00eancia aqui \u00e9 sempre inicializar suas vari\u00e1veis corretamente antes de us\u00e1-las.<\/p>\n<h3 id=\"4-typeerror--undefined-is-not-an-object\" class=\"has-anchor-hash\">4. TypeError: \u2018undefined\u2019 is not an object<\/h3>\n<p>Este erro ocorre no Safari quando voc\u00ea tenta acessar as propriedades de ou chamar um m\u00e9todo sobre um objeto indefinido. Voc\u00ea pode executar o mesmo c\u00f3digo de cima para reproduzir o erro voc\u00ea mesmo.<\/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=\"TypeError exemplo com fun\u00e7\u00e3o indefinida.\" width=\"1146\" height=\"172\"><figcaption id=\"caption-attachment-110250\" class=\"wp-caption-text\">TypeError exemplo com fun\u00e7\u00e3o indefinida.<\/figcaption><\/figure>\n<p>A solu\u00e7\u00e3o para este erro tamb\u00e9m \u00e9 a mesma &#8211; certifique-se de que voc\u00ea iniciou suas vari\u00e1veis corretamente e que elas n\u00e3o estejam indefinidas quando uma propriedade ou m\u00e9todo \u00e9 acessado.<\/p>\n<h3>5. TypeError: null is not an object<\/h3>\n<p>Isto \u00e9, novamente, similar ao erro anterior. Ocorre no Safari, e a \u00fanica diferen\u00e7a entre os dois erros \u00e9 que este \u00e9 lan\u00e7ado quando o objeto cuja propriedade ou m\u00e9todo est\u00e1 sendo acessado \u00e9 <code>null<\/code> ao inv\u00e9s de <code>undefined<\/code>. Voc\u00ea pode reproduzir isto executando o seguinte trecho de c\u00f3digo:<\/p>\n<pre><code class=\"language-js\">var func = null\n\nfunc.call()<\/code><\/pre>\n<p>Este \u00e9 o resultado que voc\u00ea obter\u00e1:<\/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=\"TypeError exemplo com fun\u00e7\u00e3o nula.\" width=\"1146\" height=\"142\"><figcaption id=\"caption-attachment-110243\" class=\"wp-caption-text\">TypeError exemplo com fun\u00e7\u00e3o nula.<\/figcaption><\/figure>\n<p>Como <code>null<\/code> \u00e9 um valor explicitamente definido para uma vari\u00e1vel e n\u00e3o atribu\u00eddo automaticamente pelo JavaScript. Este erro s\u00f3 pode ocorrer se voc\u00ea estiver tentando acessar uma vari\u00e1vel que voc\u00ea mesmo definiu em <code>null<\/code>. Ent\u00e3o, voc\u00ea precisa revisitar seu c\u00f3digo e verificar se a l\u00f3gica que voc\u00ea escreveu est\u00e1 correta ou n\u00e3o.<\/p>\n<h3>6. TypeError: Cannot read property \u2018length\u2019<\/h3>\n<p>Este erro ocorre no Chrome quando voc\u00ea tenta ler o comprimento de um objeto <code>null<\/code> ou <code>undefined<\/code>. A causa desta edi\u00e7\u00e3o \u00e9 semelhante \u00e0s edi\u00e7\u00f5es anteriores, mas ela ocorre com bastante frequ\u00eancia enquanto manipula listas; por isso merece uma men\u00e7\u00e3o especial. Aqui est\u00e1 como voc\u00ea pode reproduzir o 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=\"TypeError exemplo com um objeto indefinido.\" width=\"937\" height=\"230\"><figcaption id=\"caption-attachment-110244\" class=\"wp-caption-text\">TypeError exemplo com um objeto indefinido.<\/figcaption><\/figure>\n<p>No entanto, nas vers\u00f5es mais recentes do Chrome, este erro \u00e9 relatado como <code>Uncaught TypeError: Cannot read properties of undefined<\/code>. Esta \u00e9 a apar\u00eancia atual:<\/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=\"TypeError exemplo com um objeto indefinido nas vers\u00f5es mais recentes do Chrome.\" width=\"1400\" height=\"174\"><figcaption id=\"caption-attachment-110247\" class=\"wp-caption-text\">TypeError exemplo com um objeto indefinido nas vers\u00f5es mais recentes do Chrome.<\/figcaption><\/figure>\n<p>A corre\u00e7\u00e3o, novamente, \u00e9 garantir que o objeto cujo comprimento voc\u00ea est\u00e1 tentando acessar exista e n\u00e3o esteja configurado para <code>null<\/code>.<\/p>\n<h3 id=\"7-typeerror--undefined-is-not-a-function\" class=\"has-anchor-hash\">7. TypeError: \u2018undefined\u2019 is not a function<\/h3>\n<p>Este erro ocorre quando voc\u00ea tenta invocar um m\u00e9todo que n\u00e3o existe em seu script, ou existe mas n\u00e3o pode ser referenciado no contexto da chamada. Este erro geralmente ocorre no Google Chrome, e voc\u00ea pode resolv\u00ea-lo verificando a linha de c\u00f3digo que lan\u00e7a o erro. Se voc\u00ea encontrar um erro de digita\u00e7\u00e3o, corrija e verifique se ele resolve o seu problema.<\/p>\n<p>Se voc\u00ea usou a palavra-chave auto-refer\u00eancia <code>this<\/code> em seu c\u00f3digo, este erro pode surgir se <code>this<\/code> n\u00e3o estiver adequadamente vinculado ao seu contexto. Considere o seguinte 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>Se voc\u00ea executar o c\u00f3digo acima, ele vai lan\u00e7ar o erro que discutimos. Isso acontece porque a fun\u00e7\u00e3o an\u00f4nima passada como o ouvinte do evento est\u00e1 sendo executada no contexto do <code>document<\/code>.<\/p>\n<p>Em contraste, a fun\u00e7\u00e3o <code>showAlert<\/code> \u00e9 definida no contexto da <code>window<\/code>.<\/p>\n<p>Para resolver isso, voc\u00ea deve passar a devida refer\u00eancia \u00e0 fun\u00e7\u00e3o vinculando-a com o 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: event is not defined<\/h3>\n<p>Este erro ocorre quando voc\u00ea tenta acessar uma refer\u00eancia n\u00e3o definida no escopo da chamada. Isto geralmente acontece quando se trata de eventos, j\u00e1 que eles freq\u00fcentemente fornecem a voc\u00ea uma refer\u00eancia chamada <code>event<\/code> na fun\u00e7\u00e3o callbacks. Este erro pode ocorrer se voc\u00ea esquecer de definir o argumento do evento nos par\u00e2metros da sua fun\u00e7\u00e3o ou escrev\u00ea-lo incorretamente.<\/p>\n<p>Este erro pode n\u00e3o ocorrer no Internet Explorer ou no Google Chrome (j\u00e1 que o IE oferece uma vari\u00e1vel de evento global e o Chrome anexa a vari\u00e1vel de evento automaticamente ao manipulador), mas ele pode ocorrer no Firefox. Portanto, \u00e9 aconselh\u00e1vel ficar de olho em erros t\u00e3o pequenos.<\/p>\n<h3>9. TypeError: Assignment to constant variable<\/h3>\n<p>Este \u00e9 um erro que surge por descuido. Se voc\u00ea tentar atribuir um novo valor a uma vari\u00e1vel constante, voc\u00ea ser\u00e1 recebido com tal 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=\"TypeError exemplo com atribui\u00e7\u00e3o de objeto constante.\" width=\"1392\" height=\"124\"><figcaption id=\"caption-attachment-110248\" class=\"wp-caption-text\">TypeError exemplo com atribui\u00e7\u00e3o de objeto constante.<\/figcaption><\/figure>\n<p>Embora pare\u00e7a f\u00e1cil de corrigir agora mesmo, imagine centenas dessas declara\u00e7\u00f5es vari\u00e1veis e uma delas erroneamente definida como <code>const<\/code> ao inv\u00e9s de <code>let<\/code>! <a href=\"https:\/\/kinsta.com\/pt\/blog\/php-vs-javascript\/#variable-and-constant-definitions\">Ao contr\u00e1rio de outras linguagens de script como PHP<\/a>, h\u00e1 uma diferen\u00e7a m\u00ednima entre o estilo de declara\u00e7\u00e3o de constantes e vari\u00e1veis em JavaScript. Portanto, \u00e9 aconselh\u00e1vel verificar suas declara\u00e7\u00f5es antes de tudo quando voc\u00ea enfrenta este erro. Voc\u00ea tamb\u00e9m pode se deparar com este erro se voc\u00ea<i> esquecer<\/i> que a referida refer\u00eancia \u00e9 uma constante e us\u00e1-la como vari\u00e1vel. Isto indica descuido ou uma falha na l\u00f3gica do seu aplicativo. Certifique-se de verificar isto ao tentar corrigir este problema.<\/p>\n<h3>10. (unknown): Script error<\/h3>\n<p>Um erro de script ocorre quando um script de terceiros envia um erro para o seu navegador. Este erro \u00e9 seguido por <i>(desconhecido) porque<\/i> o script de terceiros pertence a um dom\u00ednio diferente do seu aplicativo. O navegador esconde outros detalhes para evitar vazamento de informa\u00e7\u00f5es confidenciais do script de terceiros.<\/p>\n<p>Voc\u00ea n\u00e3o pode resolver este erro sem conhecer os detalhes completos. Aqui est\u00e1 o que voc\u00ea pode fazer para obter mais informa\u00e7\u00f5es sobre o erro:<\/p>\n<ol>\n<li>Adicione o atributo <code>crossorigin<\/code> na tag do script.<\/li>\n<li>Defina o cabe\u00e7alho <code>Access-Control-Allow-Origin<\/code> correto no servidor que hospeda o script.<\/li>\n<li>[Opcional] Se voc\u00ea n\u00e3o tiver acesso ao servidor que hospeda o script, voc\u00ea pode considerar o uso de um proxy para retransmitir sua solicita\u00e7\u00e3o ao servidor e de volta ao cliente com os cabe\u00e7alhos corretos.<\/li>\n<\/ol>\n<p>Uma vez que voc\u00ea possa acessar os detalhes do erro, voc\u00ea pode ent\u00e3o definir para corrigir o problema, que provavelmente ser\u00e1 com a biblioteca de terceiros ou com a rede.<\/p>\n<h2>Como identificar e prevenir erros no JavaScript<\/h2>\n<p>Embora os erros discutidos acima sejam os mais comuns e frequentes no JavaScript, voc\u00ea se deparar\u00e1, confiar em alguns exemplos nunca pode ser suficiente. \u00c9 vital entender como detectar e prevenir qualquer tipo de erro em um aplicativo JavaScript enquanto a desenvolve. Aqui est\u00e1 como voc\u00ea pode lidar com erros no JavaScript.<\/p>\n<h3>Erros de lan\u00e7amento manual e catch<\/h3>\n<p>A maneira mais fundamental de lidar com erros que foram lan\u00e7ados manualmente ou pelo tempo de execu\u00e7\u00e3o \u00e9 peg\u00e1-los. Como a maioria das outras linguagens, o JavaScript oferece um conjunto de palavras-chave para lidar com os erros. \u00c9 essencial conhecer a fundo cada uma delas antes de defin\u00ed-las para lidar com os erros em seu aplicativo JavaScript.<\/p>\n<h4 id=\"throw\" class=\"has-anchor-hash\">throw<\/h4>\n<p>A primeira e mais b\u00e1sica palavra-chave do conjunto \u00e9 <code>throw<\/code>. Como \u00e9 evidente, a palavra-chave throw \u00e9 usada para lan\u00e7ar erros para criar exce\u00e7\u00f5es no tempo de execu\u00e7\u00e3o do JavaScript manualmente. J\u00e1 discutimos isso antes na pe\u00e7a, e aqui est\u00e1 a ess\u00eancia do significado dessa palavra-chave:<\/p>\n<ul>\n<li>Voc\u00ea pode <code>throw<\/code> qualquer coisa, incluindo n\u00fameros, strings, e objetos <code>Error<\/code>.<\/li>\n<li>Entretanto, n\u00e3o \u00e9 aconselh\u00e1vel lan\u00e7ar tipos de dados primitivos, como strings e n\u00fameros, j\u00e1 que eles n\u00e3o carregam informa\u00e7\u00f5es de depura\u00e7\u00e3o sobre os erros.<\/li>\n<li>Exemplo <code>throw TypeError(\"Please provide a string\")<\/code><\/li>\n<\/ul>\n<h4>try<\/h4>\n<p>A palavra-chave <code>try<\/code> \u00e9 usada para indicar que um bloco de c\u00f3digo pode lan\u00e7ar uma exce\u00e7\u00e3o. Sua sintaxe \u00e9:<\/p>\n<pre><code class=\"language-js\">try {\n    \/\/ error-prone code here\n}<\/code><\/pre>\n<p>\u00c9 importante notar que um bloco <code>catch<\/code> deve sempre seguir o bloco <code>try<\/code> para lidar com os erros de forma eficaz.<\/p>\n<h4>catch<\/h4>\n<p>A palavra-chave <code>catch<\/code> \u00e9 usada para criar um bloco catch. Este bloco de c\u00f3digo \u00e9 respons\u00e1vel por lidar com os erros que o bloco <code>try<\/code> captura. Aqui est\u00e1 a sua sintaxe:<\/p>\n<pre><code class=\"language-js\">catch (exception) {\n    \/\/ code to handle the exception here\n}<\/code><\/pre>\n<p>E \u00e9 assim que voc\u00ea implementa o <code>try<\/code> e os blocos <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>Ao contr\u00e1rio do C++ ou Java, voc\u00ea n\u00e3o pode anexar v\u00e1rios blocos <code>catch<\/code> a um bloco <code>try<\/code> em JavaScript. Isto significa que voc\u00ea n\u00e3o pode fazer isto:<\/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>Ao inv\u00e9s disso, voc\u00ea pode usar uma declara\u00e7\u00e3o <code>if...else<\/code> ou uma declara\u00e7\u00e3o de caso de troca dentro do bloco catch \u00fanico para lidar com todos os poss\u00edveis casos de erro. Isso seria parecido com isto:<\/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>A palavra-chave <code>finally<\/code> \u00e9 usada para definir um bloco de c\u00f3digo que \u00e9 executado ap\u00f3s um erro ter sido tratado. Este bloco \u00e9 executado ap\u00f3s o try e os blocos catch.<\/p>\n<p>Al\u00e9m disso, o \u00faltimo bloco ser\u00e1 executado independentemente do resultado dos outros dois blocos. Isto significa que mesmo que o bloco catch n\u00e3o possa lidar inteiramente com o erro ou um erro seja lan\u00e7ado no bloco catch, o int\u00e9rprete executar\u00e1 o c\u00f3digo no bloco final antes que o programa trave.<\/p>\n<p>Para ser considerado v\u00e1lido, o bloco try no JavaScript precisa ser seguido ou por um catch ou por um bloqueio final. Sem nenhum deles, o int\u00e9rprete ir\u00e1 levantar uma SyntaxError. Portanto, certifique-se de seguir seus blocos try com pelo menos um deles ao lidar com erros.<\/p>\n<h3>Gerencie os erros de maneira global com o m\u00e9todo onerror()<\/h3>\n<p>O m\u00e9todo <code>onerror()<\/code> est\u00e1 dispon\u00edvel para todos os elementos HTML para lidar com quaisquer erros que possam ocorrer com eles. Por exemplo, se uma tag <code>img<\/code> n\u00e3o encontrar a imagem cuja URL \u00e9 especificada, ela dispara seu m\u00e9todo onerror para permitir ao usu\u00e1rio lidar com o erro.<\/p>\n<p>Normalmente, voc\u00ea forneceria outra URL de imagem na chamada ao erro para que a tag <code>img<\/code> voltasse a cair. \u00c9 assim que voc\u00ea pode fazer isso via 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>No entanto, voc\u00ea pode usar este recurso para criar um mecanismo global de gerenciamento de erros para o seu aplicativo. Aqui est\u00e1 como voc\u00ea pode fazer isso:<\/p>\n<pre><code class=\"language-js\">window.onerror = (event) =&gt; {\n    console.log(\"Error occurred: \" + event)\n}<\/code><\/pre>\n<p>Com este manipulador de eventos, voc\u00ea pode se livrar dos m\u00faltiplos blocos <code>try...catch<\/code> espalhados em seu c\u00f3digo e centralizar o gerenciamento de erros do seu aplicativo de forma similar ao gerenciamento de eventos. Voc\u00ea pode anexar v\u00e1rios manipuladores de erros \u00e0 janela para manter o Princ\u00edpio de Responsabilidade \u00danica dos princ\u00edpios de design SOLID. O int\u00e9rprete ir\u00e1 percorrer todos os manipuladores at\u00e9 que chegue ao apropriado.<\/p>\n<h3>Transmita os erros via callbacks<\/h3>\n<p>Enquanto fun\u00e7\u00f5es simples e lineares permitem que o gerenciamento de erros permane\u00e7a simples, os callbacks podem complicar o caso.<\/p>\n<p>Considere o seguinte trecho 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>A fun\u00e7\u00e3o acima demonstra uma condi\u00e7\u00e3o ass\u00edncrona na qual uma fun\u00e7\u00e3o leva algum tempo para processar opera\u00e7\u00f5es e retorna o resultado mais tarde com a ajuda de um callbacks.<\/p>\n<p>Se voc\u00ea tentar inserir uma string ao inv\u00e9s de 4 na chamada de fun\u00e7\u00e3o, voc\u00ea receber\u00e1 <code>NaN<\/code> como resultado.<\/p>\n<p>Isto precisa ser tratado adequadamente. Aqui est\u00e1 como:<\/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>Isto deve resolver o problema de forma ideal. Entretanto, se voc\u00ea tentar passar uma string para a chamada de fun\u00e7\u00e3o, voc\u00ea receber\u00e1 isto:<\/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=\"Exemplo de erro com o argumento errado.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110236\" class=\"wp-caption-text\">Exemplo de erro com o argumento errado.<\/figcaption><\/figure>\n<p>Mesmo que voc\u00ea tenha implementado um bloco try enquanto chamava a fun\u00e7\u00e3o, ele ainda diz que o erro n\u00e3o foi corrigido. O erro \u00e9 lan\u00e7ado ap\u00f3s o bloco catch ter sido executado devido ao timeout delay.<\/p>\n<p>Isso pode ocorrer rapidamente em chamadas de rede, onde atrasos inesperados se infiltram. Voc\u00ea precisa cobrir tais casos enquanto desenvolve seu aplicativo.<\/p>\n<p>Aqui est\u00e1 como voc\u00ea pode lidar corretamente com os erros nos callbacks:<\/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>Agora, o resultado no console 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=\"TypeError exemplo com argumento ilegal.\" width=\"1100\" height=\"84\"><figcaption id=\"caption-attachment-110238\" class=\"wp-caption-text\">TypeError exemplo com argumento ilegal.<\/figcaption><\/figure>\n<p>Isto indica que o erro foi tratado de forma apropriada.<\/p>\n<h3>Resolva os erros Promises<\/h3>\n<p>A maioria das pessoas tende a preferir promises para lidar com atividades ass\u00edncronas. As promises t\u00eam outra vantagem &#8211; uma promises rejeitada n\u00e3o termina o seu script. No entanto, voc\u00ea ainda precisa implementar um bloqueio para lidar com os erros nas promises. Para entender isso melhor, vamos reescrever a fun\u00e7\u00e3o <code>calculateCube()<\/code> usando promise:<\/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>O timeout do c\u00f3digo anterior foi isolado na fun\u00e7\u00e3o <code>delay<\/code> para compreens\u00e3o. Se voc\u00ea tentar inserir uma string ao inv\u00e9s de 4, a resultado que voc\u00ea obt\u00e9m ser\u00e1 semelhante 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=\"TypeError exemplo com um argumento ilegal em Promise\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110235\" class=\"wp-caption-text\">TypeError exemplo com um argumento ilegal em Promise<\/figcaption><\/figure>\n<p>Mais uma vez, isto se deve ao lan\u00e7amento do erro em <code>Promise<\/code> depois de tudo o resto ter completado a execu\u00e7\u00e3o. A solu\u00e7\u00e3o para este problema \u00e9 simples. Simplesmente adicione uma chamada <code>catch()<\/code> \u00e0 cadeia de promises\u00a0como esta:<\/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>Agora o resultado 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=\"Exemplo do TypeError com argumento ilegal.\" width=\"1100\" height=\"100\"><figcaption id=\"caption-attachment-110242\" class=\"wp-caption-text\">Exemplo do TypeError com argumento ilegal.<\/figcaption><\/figure>\n<p>Voc\u00ea pode observar como \u00e9 f\u00e1cil lidar com erros com promises. Al\u00e9m disso, voc\u00ea pode encadear um bloco <code>finally()<\/code> e a chamada de promessa para adicionar c\u00f3digo que ser\u00e1 executado ap\u00f3s o gerenciamento de erros ter sido completado.<\/p>\n<p>Alternativamente, voc\u00ea tamb\u00e9m pode lidar com erros em promises\u00a0usando a t\u00e9cnica tradicional try-catch-finally. Aqui est\u00e1 como seria a sua promessa nesse 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>Entretanto, isto funciona apenas dentro de uma fun\u00e7\u00e3o ass\u00edncrona. Portanto, a maneira mais preferida de lidar com erros em promises\u00a0\u00e9 encadear <code>catch<\/code> e <code>finally<\/code> para a chamada de promessa.<\/p>\n<h3 id=\"throwcatch-vs-onerror-vs-callbacks-vs-promises-which-is-the-best\" class=\"has-anchor-hash\">throw\/catch vs onerror() vs Callbacks vs Promises: Qual \u00e9 a melhor?<\/h3>\n<p>Com quatro m\u00e9todos \u00e0 sua disposi\u00e7\u00e3o, voc\u00ea deve saber como escolher o mais apropriado em qualquer caso de uso. Aqui est\u00e1 como voc\u00eas podem decidir por si mesmos:<\/p>\n<h4 id=\"throwcatch\" class=\"has-anchor-hash\">throw\/catch<\/h4>\n<p>Voc\u00ea estar\u00e1 usando este m\u00e9todo a maior parte do tempo. Certifique-se de implementar condi\u00e7\u00f5es para todos os poss\u00edveis erros dentro do seu bloco catch e lembre-se de incluir um bloco final se voc\u00ea precisar executar algumas rotinas de limpeza de mem\u00f3ria ap\u00f3s o bloco try.<\/p>\n<p>No entanto, muitos blocos de throw\/catch podem tornar seu c\u00f3digo dif\u00edcil de ser mantido. Se voc\u00ea se encontrar em tal situa\u00e7\u00e3o, voc\u00ea pode querer lidar com erros atrav\u00e9s do manipulador global ou do m\u00e9todo de promessa.<\/p>\n<p>Ao decidir entre try\/catch blocks ass\u00edncronos e promise <code>catch()<\/code>, \u00e9 aconselh\u00e1vel optar por try\/catch blocks ass\u00edncronos porque eles tornar\u00e3o seu c\u00f3digo simples e f\u00e1cil de depurar.<\/p>\n<h4>onerror()<\/h4>\n<p>\u00c9 melhor usar o m\u00e9todo <code>onerror()<\/code> quando voc\u00ea sabe que seu aplicativo tem que lidar com muitos erros, e eles podem estar bem espalhados por toda a base de c\u00f3digo. O m\u00e9todo <code>onerror<\/code> permite que voc\u00ea trate os erros como se eles fossem apenas mais um evento tratado pelo seu aplicativo. Voc\u00ea pode definir v\u00e1rios manipuladores de erros e anex\u00e1-los \u00e0 janela do seu aplicativo na renderiza\u00e7\u00e3o inicial.<\/p>\n<p>No entanto, voc\u00ea tamb\u00e9m deve lembrar que o m\u00e9todo <code>onerror()<\/code> pode ser desnecessariamente desafiador para se estabelecer em projetos menores com um escopo de erro menor. Se voc\u00ea tem certeza de que seu aplicativo n\u00e3o vai arremessar muitos erros, o m\u00e9todo tradicional de arremesso\/catch funcionar\u00e1 melhor para voc\u00ea.<\/p>\n<h4>Callbacks e Promises<\/h4>\n<p>O gerenciamento de erros nos callbacks e promises difere devido ao seu design e estrutura de c\u00f3digo. Entretanto, se voc\u00ea escolher entre estes dois antes de ter escrito seu c\u00f3digo, seria melhor optar por promises.<\/p>\n<p>Isto porque os promises t\u00eam uma constru\u00e7\u00e3o embutida para encadear um <code>catch()<\/code> e um bloco <code>finally()<\/code> para lidar facilmente com os erros. Este m\u00e9todo \u00e9 mais f\u00e1cil e limpo do que definir argumentos adicionais\/reusar argumentos existentes para lidar com os erros.<\/p>\n<h3>Mantenha o controle das mudan\u00e7as com os reposit\u00f3rios Git<\/h3>\n<p>Muitos erros frequentemente surgem devido a erros manuais na base de c\u00f3digo. Ao desenvolver ou depurar o seu c\u00f3digo, voc\u00ea pode acabar fazendo mudan\u00e7as desnecess\u00e1rias que podem causar novos erros na sua base de c\u00f3digo. O <a href=\"https:\/\/kinsta.com\/pt\/docs\/hospedagem-de-wordpress\/referencia-do-wordpress\/perguntas-frequentes-tecnicas\/\">teste automatizado<\/a> \u00e9 uma \u00f3tima maneira de manter seu c\u00f3digo sob controle ap\u00f3s cada mudan\u00e7a. Entretanto, ele s\u00f3 pode dizer a voc\u00ea se algo estiver errado. Se voc\u00ea n\u00e3o fizer backups frequentes do seu c\u00f3digo, voc\u00ea vai acabar perdendo tempo tentando corrigir uma fun\u00e7\u00e3o ou um script que estava funcionando muito bem antes.<\/p>\n<p>\u00c9 aqui que o git desempenha seu papel. Com uma estrat\u00e9gia de comprometimento apropriada, voc\u00ea pode usar seu hist\u00f3rico de git como um sistema de backup para visualizar seu c\u00f3digo \u00e0 medida que ele evolui atrav\u00e9s do desenvolvimento. Voc\u00ea pode facilmente navegar por seus commits mais antigos e descobrir a vers\u00e3o da fun\u00e7\u00e3o funcionando bem antes, mas lan\u00e7ando erros ap\u00f3s uma mudan\u00e7a n\u00e3o relacionada.<\/p>\n<p>Voc\u00ea pode ent\u00e3o restaurar o c\u00f3digo antigo ou comparar as duas vers\u00f5es para determinar o que deu errado. <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramentas-de-desenvolvimento-web\/\">Ferramentas modernas de desenvolvimento web<\/a> como <a href=\"https:\/\/kinsta.com\/pt\/blog\/que-github\/\">GitHub<\/a> Desktop ou GitKraken ajudam voc\u00ea a visualizar estas mudan\u00e7as lado a lado e descobrir os erros rapidamente.<\/p>\n<p>Um h\u00e1bito que pode ajud\u00e1-lo a cometer menos erros \u00e9 executar <a href=\"https:\/\/kinsta.com\/pt\/blog\/ferramentas-de-revisao-de-codigo\/\">revis\u00f5es de c\u00f3digo<\/a> sempre que voc\u00ea faz uma mudan\u00e7a significativa no seu c\u00f3digo. Se voc\u00ea estiver trabalhando em equipe, voc\u00ea pode criar uma solicita\u00e7\u00e3o de puxar e pedir a um membro da equipe que a revise minuciosamente. Isto o ajudar\u00e1 a usar um segundo par de olhos para detectar quaisquer erros que possam ter passado por voc\u00ea.<\/p>\n<h2>Melhores pr\u00e1ticas para o gerenciamento de erros no Javascript<\/h2>\n<p>Os m\u00e9todos acima mencionados s\u00e3o adequados para ajud\u00e1-lo a projetar uma abordagem robusta de gerenciamento de erros para o seu pr\u00f3ximo aplicativo JavaScript. Entretanto, seria melhor manter algumas coisas em mente enquanto as implementa para obter o melhor de sua prova de erros. Aqui est\u00e3o algumas dicas para ajudar voc\u00ea.<\/p>\n<h3>1. Use erros personalizados ao lidar com exce\u00e7\u00f5es operacionais<\/h3>\n<p>Introduzimos erros personalizados no in\u00edcio deste guia para lhe dar uma ideia de como personalizar o gerenciamento de erros para o caso \u00fanico do seu aplicativo. \u00c9 aconselh\u00e1vel usar os erros personalizados sempre que poss\u00edvel ao inv\u00e9s da classe gen\u00e9rica <code>Error<\/code>, pois ela fornece mais informa\u00e7\u00f5es contextuais ao ambiente de chamada sobre o erro.<\/p>\n<p>Al\u00e9m disso, os erros personalizados permitem que voc\u00ea modere a forma como um erro \u00e9 exibido no ambiente de chamada. Isto significa que voc\u00ea pode escolher ocultar detalhes espec\u00edficos ou exibir informa\u00e7\u00f5es adicionais sobre o erro como e quando voc\u00ea desejar.<\/p>\n<p>Voc\u00ea pode ir ao ponto de formatar o conte\u00fado de erro de acordo com suas necessidades. Isto lhe d\u00e1 melhor controle sobre como o erro \u00e9 interpretado e tratado.<\/p>\n<h3>2. N\u00e3o aceite nenhuma exce\u00e7\u00e3o<\/h3>\n<p>Mesmo os desenvolvedores mais experientes geralmente cometem um erro de novato &#8211; consumindo n\u00edveis de exce\u00e7\u00e3o no fundo do seu c\u00f3digo.<\/p>\n<p>Voc\u00ea pode se deparar com situa\u00e7\u00f5es em que voc\u00ea tem um parte de c\u00f3digo que \u00e9 opcional para rodar. Se ele funcionar, \u00f3timo; se n\u00e3o funcionar, voc\u00ea n\u00e3o precisa fazer nada a respeito.<\/p>\n<p>Nesses casos, \u00e9 frequentemente tentador colocar esse c\u00f3digo em um bloco try e anexar um bloco catch vazio a ele. No entanto, ao fazer isso, voc\u00ea deixar\u00e1 esse peda\u00e7o de c\u00f3digo aberto para causar <i>qualquer<\/i> tipo de erro e se safar com ele. Isto pode se tornar perigoso se voc\u00ea tiver uma grande base de c\u00f3digo e muitos exemplos de constru\u00e7\u00f5es de gerenciamento de erros t\u00e3o ruins.<\/p>\n<p>A melhor maneira de lidar com exce\u00e7\u00f5es \u00e9 determinar um n\u00edvel no qual todas elas ser\u00e3o tratadas e elev\u00e1-las at\u00e9 l\u00e1. Este n\u00edvel pode ser um controlador (em um aplicativo de arquitetura MVC) ou um middleware (em um aplicativo tradicional orientado ao servidor).<\/p>\n<p>Desta forma, voc\u00ea vai saber onde voc\u00ea pode encontrar todos os erros que ocorrem em seu aplicativo e escolher como resolv\u00ea-los, mesmo que isso signifique n\u00e3o fazer nada a respeito deles.<\/p>\n<h3>3. Use uma estrat\u00e9gia centralizada para registros e alertas de erro<\/h3>\n<p>O registro de um erro \u00e9 frequentemente uma parte integrante do seu gerenciamento. Aqueles que n\u00e3o desenvolvem uma estrat\u00e9gia centralizada para o registro de erros podem perder informa\u00e7\u00f5es valiosas sobre o uso do seu aplicativo.<\/p>\n<p>Os registros de eventos de um aplicativo podem ajudar voc\u00ea a descobrir dados cruciais sobre erros e ajudar a depur\u00e1-los rapidamente. Se voc\u00ea tiver mecanismos de alerta apropriados configurados em seu aplicativo, voc\u00ea pode saber quando um erro ocorre em seu aplicativo antes que ele chegue a uma grande se\u00e7\u00e3o de sua base de usu\u00e1rios.<\/p>\n<p>\u00c9 aconselh\u00e1vel usar um registrador pr\u00e9-constru\u00eddo ou criar um para atender \u00e0s suas necessidades. Voc\u00ea pode configurar este registrador para lidar com erros com base em seus n\u00edveis (aviso, depura\u00e7\u00e3o, informa\u00e7\u00e3o, etc.), e alguns registradores chegam ao ponto de enviar os registros para servidores de registro remoto imediatamente. Desta forma, voc\u00ea pode observar como a l\u00f3gica do seu aplicativo se comporta com usu\u00e1rios ativos.<\/p>\n<h3>4. Notifique os usu\u00e1rios sobre erros de forma apropriada<\/h3>\n<p>Outro bom ponto a ter em mente ao definir sua estrat\u00e9gia de gerenciamento de erros \u00e9 manter o usu\u00e1rio em mente.<\/p>\n<p>Todos os erros que interferem no funcionamento normal do seu aplicativo devem apresentar um alerta vis\u00edvel ao usu\u00e1rio para notific\u00e1-lo de que algo deu errado para que o usu\u00e1rio possa tentar encontrar uma solu\u00e7\u00e3o. Se voc\u00ea conhece uma corre\u00e7\u00e3o r\u00e1pida para o erro, como tentar novamente uma opera\u00e7\u00e3o ou sair e voltar a entrar, certifique-se de mencion\u00e1-lo no alerta para ajudar a corrigir a experi\u00eancia do usu\u00e1rio em tempo real.<\/p>\n<p>No caso de erros que n\u00e3o causam nenhuma interfer\u00eancia na experi\u00eancia di\u00e1ria do usu\u00e1rio, voc\u00ea pode considerar suprimir o alerta e registrar o erro em um servidor remoto para resolu\u00e7\u00e3o posterior.<\/p>\n<h3>5. Implemente um Middleware (Node.js)<\/h3>\n<p>O <a href=\"https:\/\/kinsta.com\/pt\/blog\/o-que-e-node-js\/\">ambiente Node.js<\/a> suporta middlewares para adicionar funcionalidades para aplicativos do servidor. Voc\u00ea pode usar este recurso para criar um middleware de manipula\u00e7\u00e3o de erros para o seu servidor.<\/p>\n<p>O benef\u00edcio mais significativo do uso de middleware \u00e9 que todos os seus erros s\u00e3o tratados de forma centralizada em um s\u00f3 lugar. Voc\u00ea pode optar por ativar\/desativar esta configura\u00e7\u00e3o para fins de teste facilmente.<\/p>\n<p>Aqui est\u00e1 como voc\u00ea pode criar um 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>Voc\u00ea pode ent\u00e3o usar este middleware em seu aplicativo desta forma:<\/p>\n<pre><code class=\"language-js\">const { errorLoggerMiddleware, returnErrorMiddleware } = require('.\/errorMiddleware')\n\napp.use(errorLoggerMiddleware)\n\napp.use(returnErrorMiddleware)<\/code><\/pre>\n<p>Agora voc\u00ea pode definir uma l\u00f3gica personalizada dentro do middleware para tratar os erros de forma apropriada. Voc\u00ea n\u00e3o precisa mais se preocupar em implementar constru\u00e7\u00f5es individuais de manipula\u00e7\u00e3o de erros em toda a sua base de c\u00f3digo.<\/p>\n<h3>6. Reinicie o seu aplicativo para lidar com erros de programador (Node.js)<\/h3>\n<p>Quando os aplicativos Node.js encontram erros de programador, eles podem n\u00e3o necessariamente lan\u00e7ar uma exce\u00e7\u00e3o e tentar fechar o aplicativo. Tais erros podem incluir problemas decorrentes de erros de programador, como alto consumo de CPU, incha\u00e7o da mem\u00f3ria ou vazamentos de mem\u00f3ria. A melhor maneira de lidar com isso \u00e9 reiniciar graciosamente o aplicativo, travando-o atrav\u00e9s do modo de cluster Node.js ou de uma ferramenta \u00fanica como PM2. Isso pode garantir que o aplicativo n\u00e3o trave na a\u00e7\u00e3o do usu\u00e1rio, apresentando uma experi\u00eancia de usu\u00e1rio terr\u00edvel.<\/p>\n<h3>7. Catch All Uncaught Exceptions (Node.js)<\/h3>\n<p>Voc\u00ea nunca pode ter certeza de ter coberto todos os erros poss\u00edveis que podem ocorrer em seu aplicativo. Portanto, \u00e9 essencial implementar uma estrat\u00e9gia de recupera\u00e7\u00e3o para pegar todas as exce\u00e7\u00f5es n\u00e3o detectadas em seu aplicativo.<\/p>\n<p>Aqui est\u00e1 como voc\u00ea pode fazer isso:<\/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>Voc\u00ea tamb\u00e9m pode identificar se o erro que ocorreu \u00e9 uma exce\u00e7\u00e3o padr\u00e3o ou um erro operacional personalizado. Com base no resultado, voc\u00ea pode sair do processo e reinici\u00e1-lo para evitar um comportamento inesperado.<\/p>\n<h3>8. Obtenha todas as rejei\u00e7\u00f5es de promeses n\u00e3o gerenciadas (Node.js)<\/h3>\n<p>Semelhante a como voc\u00ea nunca pode cobrir todas as poss\u00edveis exce\u00e7\u00f5es, h\u00e1 uma grande chance de que voc\u00ea possa perder de lidar com todas as poss\u00edveis rejei\u00e7\u00f5es de promises. No entanto, ao contr\u00e1rio das exce\u00e7\u00f5es, as rejei\u00e7\u00f5es de promises\u00a0n\u00e3o lan\u00e7am erros.<\/p>\n<p>Ent\u00e3o, uma promessa importante que foi rejeitada pode passar como um aviso e deixar seu aplicativo aberto para a possibilidade de se deparar com um comportamento inesperado. Por isso, \u00e9 crucial implementar um mecanismo de recurso para lidar com a rejei\u00e7\u00e3o de promises.<\/p>\n<p>Aqui est\u00e1 como voc\u00ea pode fazer isso:<\/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>Resumo<\/h2>\n<p>Como qualquer outra linguagem de programa\u00e7\u00e3o, os erros s\u00e3o bastante frequentes e naturais no JavaScript. Em alguns casos, voc\u00ea pode at\u00e9 mesmo precisar lan\u00e7ar os erros intencionalmente para indicar a resposta correta aos seus usu\u00e1rios. Portanto, compreender sua anatomia e tipos \u00e9 muito crucial.<\/p>\n<p>Al\u00e9m disso, voc\u00ea precisa estar equipado com as ferramentas e t\u00e9cnicas corretas para identificar e prevenir erros que possam derrubar seu aplicativo.<\/p>\n<p>Na maioria dos casos, uma estrat\u00e9gia s\u00f3lida para lidar com erros com execu\u00e7\u00e3o cuidadosa \u00e9 suficiente para todos os tipos de aplicativos JavaScript.<\/p>\n<p><em>Existem outros erros JavaScript que voc\u00ea ainda n\u00e3o foi capaz de resolver? Alguma t\u00e9cnica para lidar com erros JS de forma construtiva? Nos deixe sabendo nos coment\u00e1rios abaixo!<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A lei de Murphy diz que tudo que pode dar errado eventualmente dar\u00e1 errado. Isto se aplica um pouco bem demais no mundo da programa\u00e7\u00e3o. Se &#8230;<\/p>\n","protected":false},"author":238,"featured_media":46546,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[439,523,44],"topic":[976],"class_list":["post-46542","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-development","tag-javascript","tag-webdev","topic-erros-de-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>Um Guia Detalhado para o Gerenciamento de Erros no JavaScript<\/title>\n<meta name=\"description\" content=\"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.\" \/>\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\/pt\/blog\/erros-no-javascript\/\" \/>\n<meta property=\"og:locale\" content=\"pt_PT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript\" \/>\n<meta property=\"og:description\" content=\"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/kinstapt\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-02-03T14:51:05+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-22T06:32:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg\" \/>\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=\"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_pt\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kumar Harsh\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo estimado de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"34 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\"},\"author\":{\"name\":\"Kumar Harsh\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\"},\"headline\":\"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript\",\"datePublished\":\"2022-02-03T14:51:05+00:00\",\"dateModified\":\"2023-08-22T06:32:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\"},\"wordCount\":6764,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg\",\"keywords\":[\"development\",\"JavaScript\",\"webdev\"],\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\",\"url\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\",\"name\":\"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg\",\"datePublished\":\"2022-02-03T14:51:05+00:00\",\"dateModified\":\"2023-08-22T06:32:17+00:00\",\"description\":\"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#breadcrumb\"},\"inLanguage\":\"pt-PT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg\",\"width\":1460,\"height\":730,\"caption\":\"Um Guia Definitivo para Manuseio de Erros em JavaScript\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/pt\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Erros de Javascript\",\"item\":\"https:\/\/kinsta.com\/pt\/topicos\/erros-de-javascript\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/pt\/#website\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/pt\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-PT\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/pt\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/pt\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/kinstapt\/\",\"https:\/\/x.com\/kinsta_pt\",\"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\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9\",\"name\":\"Kumar Harsh\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-PT\",\"@id\":\"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/kumarharsh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript","description":"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.","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\/pt\/blog\/erros-no-javascript\/","og_locale":"pt_PT","og_type":"article","og_title":"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript","og_description":"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.","og_url":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/kinstapt\/","article_published_time":"2022-02-03T14:51:05+00:00","article_modified_time":"2023-08-22T06:32:17+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg","type":"image\/jpeg"}],"author":"Kumar Harsh","twitter_card":"summary_large_image","twitter_description":"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.","twitter_image":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg","twitter_creator":"@kinsta_pt","twitter_site":"@kinsta_pt","twitter_misc":{"Escrito por":"Kumar Harsh","Tempo estimado de leitura":"34 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/"},"author":{"name":"Kumar Harsh","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9"},"headline":"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript","datePublished":"2022-02-03T14:51:05+00:00","dateModified":"2023-08-22T06:32:17+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/"},"wordCount":6764,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg","keywords":["development","JavaScript","webdev"],"inLanguage":"pt-PT","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/","url":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/","name":"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript","isPartOf":{"@id":"https:\/\/kinsta.com\/pt\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg","datePublished":"2022-02-03T14:51:05+00:00","dateModified":"2023-08-22T06:32:17+00:00","description":"Tendo erros no seu JavaScript? Mostraremos como domar esses erros para voc\u00ea poder voltar ao desenvolvimento do seu projeto.","breadcrumb":{"@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#breadcrumb"},"inLanguage":"pt-PT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/"]}]},{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#primaryimage","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2022\/01\/erros-em-javascript.jpeg","width":1460,"height":730,"caption":"Um Guia Definitivo para Manuseio de Erros em JavaScript"},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/pt\/blog\/erros-no-javascript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/pt\/"},{"@type":"ListItem","position":2,"name":"Erros de Javascript","item":"https:\/\/kinsta.com\/pt\/topicos\/erros-de-javascript\/"},{"@type":"ListItem","position":3,"name":"Um Guia Detalhado para o Gerenciamento de Erros no JavaScript"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/pt\/#website","url":"https:\/\/kinsta.com\/pt\/","name":"Kinsta\u00ae","description":"Solu\u00e7\u00f5es de hospedagem Premium, r\u00e1pida e segura","publisher":{"@id":"https:\/\/kinsta.com\/pt\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/pt\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-PT"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/pt\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/pt\/","logo":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/pt\/wp-content\/uploads\/sites\/3\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/pt\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/kinstapt\/","https:\/\/x.com\/kinsta_pt","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\/pt\/#\/schema\/person\/3a80efffa9cbb0333cc9c22b754415d9","name":"Kumar Harsh","image":{"@type":"ImageObject","inLanguage":"pt-PT","@id":"https:\/\/kinsta.com\/pt\/#\/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\/pt\/blog\/author\/kumarharsh\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/46542","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/users\/238"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/comments?post=46542"}],"version-history":[{"count":12,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/46542\/revisions"}],"predecessor-version":[{"id":60862,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/posts\/46542\/revisions\/60862"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/it"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/de"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/pt"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/es"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/nl"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/translations\/jp"},{"href":"https:\/\/kinsta.com\/pt\/wp-json\/kinsta\/v1\/posts\/46542\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media\/46546"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/media?parent=46542"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/tags?post=46542"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/pt\/wp-json\/wp\/v2\/topic?post=46542"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}