‫Instrutor: Tudo bem!
‫E agora, para terminar esta
‫seção, vamos aprender como capturar exceções não detectadas.
‫Mas o que exatamente são exceções não detectadas?
‫Bem, todos os erros, ou vamos chamá-los também de bugs, que
‫ocorrem em nosso código síncrono,
‫mas não são tratados em lugar nenhum, são chamados de exceções não detectadas.
‫E como antes, assim como com as rejeições não tratadas, também temos
‫uma maneira de lidar com as exceções não detectadas.
‫Então, deixe-me mostrar rapidamente um
‫exemplo de uma exceção não detectada.
‫Então, vamos simplesmente fingir que estamos
‫tentando consolar. registrar algo que não existe.
‫E então, imediatamente, obtemos este erro aqui, x não está definido
‫e, por padrão, obtemos todo o rastreamento de pilha
‫aqui impresso no console.
‫Tudo bem.
‫E agora, para consertar isso, isso é muito semelhante a fazer as
‫rejeições não tratadas.
‫Então, novamente, estamos ouvindo um evento, desta
‫vez é chamado uncaughtException.
‫E é claro que precisa estar entre aspas.
‫E então, como antes, passamos nossa função de retorno de chamada.
‫OK.
‫E agora, na verdade, o que estamos fazendo aqui é muito
‫semelhante ao que fizemos aqui.
‫Queremos bloquear o erro no
‫console para que apareça nos logs de nosso servidor, certo?
‫Então, nos dando uma maneira de corrigir o problema.
‫E então queremos desligar o servidor normalmente.
‫Então vamos, bem, na verdade
‫aqui eu quero imprimir todo o erro no
‫console, e não apenas a mensagem, ok?
‫E também vamos mudar a ordem aqui,
‫mas é isso.
‫Portanto, o resto é o mesmo.
‫E
‫aqui está, é claro, EXCEÇÃO INCAPACITADA!
‫Agora eu poderia refatorar isso aqui em uma
‫função legal, mas vamos mantê-lo assim, certo?
‫Ok, agora vamos executar novamente.
‫E então vamos dar uma olhada no que temos aqui.
‫E, de fato, agora vemos EXCEÇÃO INCAPACITADA!
‫Desligando.
‫Tudo bem?
‫E, na verdade, isso novamente imprime a pilha inteira no
‫console, mas eu realmente não quero isso.
‫Eu não gosto disso.
‫Então, vamos voltar ao que tínhamos aqui.
‫Então erre. nome e depois errar. mensagem.
‫Ok, e agora
‫temos o ReferenceError que x não está definido, ok?
‫E vamos colocar o mesmo aqui.
‫Assim como era antes.
‫Tudo bem.
‫E isso é tudo
‫o que há para detectar exceções não detectadas.
‫Agora, enquanto aqui na rejeição não tratada,
‫travar o aplicativo como fizemos aqui é opcional,
‫quando há uma exceção não
‫detectada, realmente precisamos travar nosso aplicativo porque depois que
‫houve uma exceção não detectada, todo o
‫processo do nó
‫está -chamado de estado impuro, certo?
‫E para consertar isso, o processo precisa ser
‫encerrado e reiniciado, certo?
‫E, novamente,
‫na produção, devemos ter uma
‫ferramenta que irá reiniciar o aplicativo após travar.
‫E muitos serviços de hospedagem já fazem isso
‫fora da caixa, certo?
‫Então, de forma totalmente automática, sem
‫precisarmos fazer nada.
‫Agora, em Node. js, não é
‫realmente uma boa prática confiar cegamente nesses dois manipuladores de
‫erros que acabamos de implementar aqui, certo?
‫Portanto, o ideal é que os erros
‫sejam tratados exatamente onde ocorrem.
‫Portanto, por exemplo, no problema de conexão com o banco de dados, devemos,
‫é claro, adicionar um manipulador de captura
‫e não apenas confiar no
‫retorno de chamada de rejeição não tratado que temos aqui, certo?
‫E algumas pessoas até dizem que não devemos usar isso de forma alguma,
‫mas eu discordo disso.
‫Eu acho que como uma rede de segurança,
‫digamos, eles podem ser muito úteis e fazer parte de nossa aplicação.
‫Agora, na verdade, este
‫manipulador aqui deve estar no topo do nosso código, certo?
‫Ou pelo menos antes que qualquer outro código seja realmente executado.
‫Porque observe o que acontece se eu mover esta linha de código
‫aqui antes deste manipulador.
‫Então, se eu colocar aqui,
‫por exemplo, e salvar,
‫você verá que
‫nosso manipulador não detecta essa exceção, então esse erro aqui, certo?
‫E isso é porque apenas aqui no
‫final nós realmente começamos a ouvir uma exceção não detectada.
‫Mas, neste caso aqui, a exceção não
‫detectada acontece antes mesmo de ouvirmos esse evento.
‫E então, não temos como pegar, certo?
‫E então, idealmente, devemos colocá-lo aqui, bem no topo, novamente antes que
‫qualquer outro código seja executado.
‫Especialmente aquele em nosso aplicativo.
‫Então, vamos colocar isso bem aqui.
‫Agora, o problema aqui
‫será que o servidor não está definido neste ponto.
‫Mas isso não
‫é um problema, porque na verdade
‫não precisamos do servidor aqui, certo?
‫E isso porque
‫esses erros, essas exceções não
‫detectadas, não vão acontecer de forma assíncrona.
‫Portanto, eles não terão nada
‫a ver com o servidor, na verdade.
‫Portanto, não precisamos disso aqui.
‫Podemos apenas salvá-lo aqui,
‫e agora o temos antes de realmente exigirmos
‫nosso aplicativo principal.
‫E se agora temos um erro,
‫vamos tentar primeiro aqui, para que
‫você veja que agora
‫estamos de volta para realmente detectá-lo em nosso manipulador de erros.
‫Mas se agora tivéssemos esse código, por exemplo, dentro do aplicativo. js, digamos, isso realmente não
‫importa, digamos que está aqui, e se executarmos
‫agora, bem, então
‫você verá que ainda estamos capturando
‫aquela exceção em nosso manipulador
‫de erros, o que antes não era o caso.
‫Tudo bem?
‫E agora, apenas para uma
‫experiência, o que você acha se colocarmos esse
‫código bem aqui nesta função de middleware?
‫O que você acha que
‫vai acontecer quando salvarmos este arquivo agora?
‫Portanto, x ainda não está definido em nenhum lugar, mas vamos
‫dar uma olhada no que acontece
‫quando agora executamos este código.
‫E agora não temos nenhum erro.
‫Ou realmente fazemos, mas isso
‫é apenas por causa de nossa rejeição não tratada, que
‫é devido ao fato de que
‫nossa senha aqui ainda está errada.
‫Portanto, se salvarmos e salvarmos novamente, você
‫não verá nenhum erro.
‫E, de fato, não fazemos.
‫E por que isto?
‫Bem, é porque essa função de middleware aqui,
‫é claro, só
‫é chamada assim que há uma solicitação, certo?
‫E então vamos ver o que acontece quando fazemos uma solicitação.
‫E então vamos fazer uma solicitação Get All Tours.
‫E vamos esperar por isso.
‫E aqui temos a mensagem "Algo deu muito errado! "mensagem de erro
‫com o 500, e isso
‫também porque ainda estamos
‫no modo de produção, ok?
‫Mas, de qualquer forma, receber esta mensagem aqui, lembre-se,
‫significa que temos um erro não operacional aqui.
‫Então, basicamente, um erro que não criamos nós mesmos.
‫E então, bem isso, agora entramos
‫aqui no nosso errorController, vamos bem aqui, certo?
‫Então, neste outro ramo aqui na função sendErrorProd.
‫E na verdade você
‫vê o erro aqui no console também, ok?
‫E é isso que acontece quando
‫há um erro dentro de qualquer middleware Express, certo?
‫Portanto, o Express, quando houver um
‫erro, irá automaticamente para o middleware de tratamento de erros
‫com esse erro, certo?
‫E é por isso
‫que quando obtemos um erro aqui em
‫qualquer uma de nossas funções de middleware, ele vai imediatamente para este manipulador, ok?
‫E como estamos
‫em produção, ele vai entrar neste
‫bloco aqui, mas como não é um
‫CastError, e não é esse erro, e não
‫é um ValidationError, então, assim que o erro for
‫realmente enviado, bem aqui, entramos neste bloco .
‫E de novo, é por isso que enviamos esse erro genérico, certo?
‫Agora vamos sair desse modo aqui
‫e voltar ao início normal do npm.
‫E então agora, nosso erro será enviado assim, certo?
‫Portanto, enviar erro de desenvolvimento nos dará todos os detalhes
‫sobre o erro que está ocorrendo.
‫E agora, de fato, obtemos ReferenceError: x não está definido.
‫OK?
‫Então, no app. js, linha 21.
‫E então, a linha 21 está onde está, mas vamos
‫nos livrar dela.
‫Eu só queria mostrar para você.
‫OK?
‫De qualquer forma, com isso, na verdade fechamos
‫nossa seção de tratamento de erros.
‫E poderia haver um curso inteiro sobre tratamento de
‫erros com Node e Express, porque realmente é
‫um tópico extremamente complexo.
‫Mas, nesta seção, você aprenderá o básico
‫que precisa saber para realmente começar
‫a criar aplicativos incríveis.