﻿1
00:00:01,070 --> 00:00:01,950
‫Instrutor: Tudo bem!

2
00:00:01,950 --> 00:00:04,040
‫E agora, para terminar esta

3
00:00:04,040 --> 00:00:07,043
‫seção, vamos aprender como capturar exceções não detectadas.

4
00:00:08,660 --> 00:00:11,930
‫Mas o que exatamente são exceções não detectadas?

5
00:00:11,930 --> 00:00:15,290
‫Bem, todos os erros, ou vamos chamá-los também de bugs, que

6
00:00:15,290 --> 00:00:17,280
‫ocorrem em nosso código síncrono,

7
00:00:17,280 --> 00:00:21,230
‫mas não são tratados em lugar nenhum, são chamados de exceções não detectadas.

8
00:00:21,230 --> 00:00:25,340
‫E como antes, assim como com as rejeições não tratadas, também temos

9
00:00:25,340 --> 00:00:28,730
‫uma maneira de lidar com as exceções não detectadas.

10
00:00:28,730 --> 00:00:30,720
‫Então, deixe-me mostrar rapidamente um

11
00:00:30,720 --> 00:00:32,823
‫exemplo de uma exceção não detectada.

12
00:00:34,370 --> 00:00:37,400
‫Então, vamos simplesmente fingir que estamos

13
00:00:37,400 --> 00:00:40,423
‫tentando consolar. registrar algo que não existe.

14
00:00:42,110 --> 00:00:46,600
‫E então, imediatamente, obtemos este erro aqui, x não está definido

15
00:00:46,600 --> 00:00:50,080
‫e, por padrão, obtemos todo o rastreamento de pilha

16
00:00:50,080 --> 00:00:51,960
‫aqui impresso no console.

17
00:00:51,960 --> 00:00:52,793
‫Tudo bem.

18
00:00:52,793 --> 00:00:57,660
‫E agora, para consertar isso, isso é muito semelhante a fazer as

19
00:00:57,660 --> 00:00:59,380
‫rejeições não tratadas.

20
00:00:59,380 --> 00:01:02,040
‫Então, novamente, estamos ouvindo um evento, desta

21
00:01:02,040 --> 00:01:04,040
‫vez é chamado uncaughtException.

22
00:01:08,662 --> 00:01:11,912
‫E é claro que precisa estar entre aspas.

23
00:01:12,840 --> 00:01:17,390
‫E então, como antes, passamos nossa função de retorno de chamada.

24
00:01:17,390 --> 00:01:18,223
‫OK.

25
00:01:18,223 --> 00:01:20,960
‫E agora, na verdade, o que estamos fazendo aqui é muito

26
00:01:20,960 --> 00:01:22,350
‫semelhante ao que fizemos aqui.

27
00:01:22,350 --> 00:01:24,970
‫Queremos bloquear o erro no

28
00:01:24,970 --> 00:01:29,690
‫console para que apareça nos logs de nosso servidor, certo?

29
00:01:29,690 --> 00:01:32,430
‫Então, nos dando uma maneira de corrigir o problema.

30
00:01:32,430 --> 00:01:35,223
‫E então queremos desligar o servidor normalmente.

31
00:01:36,750 --> 00:01:39,010
‫Então vamos, bem, na verdade

32
00:01:39,010 --> 00:01:41,590
‫aqui eu quero imprimir todo o erro no

33
00:01:41,590 --> 00:01:43,940
‫console, e não apenas a mensagem, ok?

34
00:01:43,940 --> 00:01:45,993
‫E também vamos mudar a ordem aqui,

35
00:01:47,300 --> 00:01:48,660
‫mas é isso.

36
00:01:48,660 --> 00:01:50,140
‫Portanto, o resto é o mesmo.

37
00:01:50,140 --> 00:01:51,290
‫E

38
00:01:53,310 --> 00:01:58,310
‫aqui está, é claro, EXCEÇÃO INCAPACITADA!

39
00:01:58,320 --> 00:02:01,810
‫Agora eu poderia refatorar isso aqui em uma

40
00:02:01,810 --> 00:02:05,020
‫função legal, mas vamos mantê-lo assim, certo?

41
00:02:05,020 --> 00:02:07,123
‫Ok, agora vamos executar novamente.

42
00:02:08,330 --> 00:02:11,090
‫E então vamos dar uma olhada no que temos aqui.

43
00:02:11,090 --> 00:02:13,700
‫E, de fato, agora vemos EXCEÇÃO INCAPACITADA!

44
00:02:13,700 --> 00:02:14,780
‫Desligando.

45
00:02:14,780 --> 00:02:15,750
‫Tudo bem?

46
00:02:15,750 --> 00:02:18,770
‫E, na verdade, isso novamente imprime a pilha inteira no

47
00:02:18,770 --> 00:02:21,400
‫console, mas eu realmente não quero isso.

48
00:02:21,400 --> 00:02:22,660
‫Eu não gosto disso.

49
00:02:22,660 --> 00:02:25,860
‫Então, vamos voltar ao que tínhamos aqui.

50
00:02:25,860 --> 00:02:28,683
‫Então erre. nome e depois errar. mensagem.

51
00:02:30,890 --> 00:02:32,610
‫Ok, e agora

52
00:02:32,610 --> 00:02:36,290
‫temos o ReferenceError que x não está definido, ok?

53
00:02:36,290 --> 00:02:38,520
‫E vamos colocar o mesmo aqui.

54
00:02:38,520 --> 00:02:39,983
‫Assim como era antes.

55
00:02:40,950 --> 00:02:41,783
‫Tudo bem.

56
00:02:41,783 --> 00:02:43,070
‫E isso é tudo

57
00:02:43,070 --> 00:02:45,370
‫o que há para detectar exceções não detectadas.

58
00:02:45,370 --> 00:02:48,180
‫Agora, enquanto aqui na rejeição não tratada,

59
00:02:48,180 --> 00:02:51,230
‫travar o aplicativo como fizemos aqui é opcional,

60
00:02:51,230 --> 00:02:53,630
‫quando há uma exceção não

61
00:02:53,630 --> 00:02:57,150
‫detectada, realmente precisamos travar nosso aplicativo porque depois que

62
00:02:57,150 --> 00:02:59,970
‫houve uma exceção não detectada, todo o

63
00:02:59,970 --> 00:03:01,610
‫processo do nó

64
00:03:01,610 --> 00:03:04,370
‫está -chamado de estado impuro, certo?

65
00:03:04,370 --> 00:03:07,770
‫E para consertar isso, o processo precisa ser

66
00:03:07,770 --> 00:03:09,940
‫encerrado e reiniciado, certo?

67
00:03:09,940 --> 00:03:11,330
‫E, novamente,

68
00:03:11,330 --> 00:03:13,460
‫na produção, devemos ter uma

69
00:03:13,460 --> 00:03:16,640
‫ferramenta que irá reiniciar o aplicativo após travar.

70
00:03:16,640 --> 00:03:19,270
‫E muitos serviços de hospedagem já fazem isso

71
00:03:19,270 --> 00:03:20,860
‫fora da caixa, certo?

72
00:03:20,860 --> 00:03:23,170
‫Então, de forma totalmente automática, sem

73
00:03:23,170 --> 00:03:24,980
‫precisarmos fazer nada.

74
00:03:24,980 --> 00:03:27,820
‫Agora, em Node. js, não é

75
00:03:27,820 --> 00:03:31,580
‫realmente uma boa prática confiar cegamente nesses dois manipuladores de

76
00:03:31,580 --> 00:03:34,170
‫erros que acabamos de implementar aqui, certo?

77
00:03:34,170 --> 00:03:36,470
‫Portanto, o ideal é que os erros

78
00:03:36,470 --> 00:03:38,120
‫sejam tratados exatamente onde ocorrem.

79
00:03:38,120 --> 00:03:42,150
‫Portanto, por exemplo, no problema de conexão com o banco de dados, devemos,

80
00:03:42,150 --> 00:03:44,660
‫é claro, adicionar um manipulador de captura

81
00:03:44,660 --> 00:03:46,480
‫e não apenas confiar no

82
00:03:46,480 --> 00:03:50,160
‫retorno de chamada de rejeição não tratado que temos aqui, certo?

83
00:03:50,160 --> 00:03:53,600
‫E algumas pessoas até dizem que não devemos usar isso de forma alguma,

84
00:03:53,600 --> 00:03:54,770
‫mas eu discordo disso.

85
00:03:54,770 --> 00:03:58,090
‫Eu acho que como uma rede de segurança,

86
00:03:58,090 --> 00:04:02,470
‫digamos, eles podem ser muito úteis e fazer parte de nossa aplicação.

87
00:04:02,470 --> 00:04:04,020
‫Agora, na verdade, este

88
00:04:04,020 --> 00:04:07,300
‫manipulador aqui deve estar no topo do nosso código, certo?

89
00:04:07,300 --> 00:04:11,280
‫Ou pelo menos antes que qualquer outro código seja realmente executado.

90
00:04:11,280 --> 00:04:14,980
‫Porque observe o que acontece se eu mover esta linha de código

91
00:04:14,980 --> 00:04:16,513
‫aqui antes deste manipulador.

92
00:04:17,350 --> 00:04:19,593
‫Então, se eu colocar aqui,

93
00:04:21,140 --> 00:04:23,070
‫por exemplo, e salvar,

94
00:04:23,070 --> 00:04:24,680
‫você verá que

95
00:04:24,680 --> 00:04:29,410
‫nosso manipulador não detecta essa exceção, então esse erro aqui, certo?

96
00:04:29,410 --> 00:04:31,830
‫E isso é porque apenas aqui no

97
00:04:31,830 --> 00:04:35,010
‫final nós realmente começamos a ouvir uma exceção não detectada.

98
00:04:35,010 --> 00:04:37,580
‫Mas, neste caso aqui, a exceção não

99
00:04:37,580 --> 00:04:40,380
‫detectada acontece antes mesmo de ouvirmos esse evento.

100
00:04:40,380 --> 00:04:44,630
‫E então, não temos como pegar, certo?

101
00:04:44,630 --> 00:04:48,920
‫E então, idealmente, devemos colocá-lo aqui, bem no topo, novamente antes que

102
00:04:48,920 --> 00:04:51,030
‫qualquer outro código seja executado.

103
00:04:51,030 --> 00:04:53,423
‫Especialmente aquele em nosso aplicativo.

104
00:04:54,580 --> 00:04:57,760
‫Então, vamos colocar isso bem aqui.

105
00:04:57,760 --> 00:04:59,550
‫Agora, o problema aqui

106
00:04:59,550 --> 00:05:02,820
‫será que o servidor não está definido neste ponto.

107
00:05:02,820 --> 00:05:04,160
‫Mas isso não

108
00:05:04,160 --> 00:05:06,180
‫é um problema, porque na verdade

109
00:05:06,180 --> 00:05:08,060
‫não precisamos do servidor aqui, certo?

110
00:05:08,060 --> 00:05:09,480
‫E isso porque

111
00:05:09,480 --> 00:05:11,270
‫esses erros, essas exceções não

112
00:05:11,270 --> 00:05:13,670
‫detectadas, não vão acontecer de forma assíncrona.

113
00:05:13,670 --> 00:05:15,630
‫Portanto, eles não terão nada

114
00:05:15,630 --> 00:05:17,660
‫a ver com o servidor, na verdade.

115
00:05:17,660 --> 00:05:19,360
‫Portanto, não precisamos disso aqui.

116
00:05:20,470 --> 00:05:22,250
‫Podemos apenas salvá-lo aqui,

117
00:05:22,250 --> 00:05:25,480
‫e agora o temos antes de realmente exigirmos

118
00:05:25,480 --> 00:05:26,890
‫nosso aplicativo principal.

119
00:05:26,890 --> 00:05:28,663
‫E se agora temos um erro,

120
00:05:29,940 --> 00:05:31,850
‫vamos tentar primeiro aqui, para que

121
00:05:31,850 --> 00:05:33,500
‫você veja que agora

122
00:05:33,500 --> 00:05:36,710
‫estamos de volta para realmente detectá-lo em nosso manipulador de erros.

123
00:05:36,710 --> 00:05:41,333
‫Mas se agora tivéssemos esse código, por exemplo, dentro do aplicativo. js, digamos, isso realmente não

124
00:05:42,350 --> 00:05:45,810
‫importa, digamos que está aqui, e se executarmos

125
00:05:45,810 --> 00:05:47,410
‫agora, bem, então

126
00:05:47,410 --> 00:05:50,260
‫você verá que ainda estamos capturando

127
00:05:50,260 --> 00:05:52,530
‫aquela exceção em nosso manipulador

128
00:05:52,530 --> 00:05:56,290
‫de erros, o que antes não era o caso.

129
00:05:56,290 --> 00:05:57,180
‫Tudo bem?

130
00:05:57,180 --> 00:05:59,590
‫E agora, apenas para uma

131
00:05:59,590 --> 00:06:03,120
‫experiência, o que você acha se colocarmos esse

132
00:06:03,120 --> 00:06:06,100
‫código bem aqui nesta função de middleware?

133
00:06:06,100 --> 00:06:07,690
‫O que você acha que

134
00:06:07,690 --> 00:06:09,510
‫vai acontecer quando salvarmos este arquivo agora?

135
00:06:09,510 --> 00:06:12,200
‫Portanto, x ainda não está definido em nenhum lugar, mas vamos

136
00:06:12,200 --> 00:06:13,840
‫dar uma olhada no que acontece

137
00:06:13,840 --> 00:06:15,373
‫quando agora executamos este código.

138
00:06:16,980 --> 00:06:19,510
‫E agora não temos nenhum erro.

139
00:06:19,510 --> 00:06:21,300
‫Ou realmente fazemos, mas isso

140
00:06:21,300 --> 00:06:24,130
‫é apenas por causa de nossa rejeição não tratada, que

141
00:06:24,130 --> 00:06:26,020
‫é devido ao fato de que

142
00:06:26,020 --> 00:06:27,920
‫nossa senha aqui ainda está errada.

143
00:06:29,290 --> 00:06:32,170
‫Portanto, se salvarmos e salvarmos novamente, você

144
00:06:32,170 --> 00:06:34,560
‫não verá nenhum erro.

145
00:06:34,560 --> 00:06:35,730
‫E, de fato, não fazemos.

146
00:06:35,730 --> 00:06:36,953
‫E por que isto?

147
00:06:37,830 --> 00:06:40,940
‫Bem, é porque essa função de middleware aqui,

148
00:06:40,940 --> 00:06:42,450
‫é claro, só

149
00:06:42,450 --> 00:06:45,220
‫é chamada assim que há uma solicitação, certo?

150
00:06:45,220 --> 00:06:48,113
‫E então vamos ver o que acontece quando fazemos uma solicitação.

151
00:06:50,760 --> 00:06:54,180
‫E então vamos fazer uma solicitação Get All Tours.

152
00:06:54,180 --> 00:06:55,720
‫E vamos esperar por isso.

153
00:06:55,720 --> 00:06:58,980
‫E aqui temos a mensagem "Algo deu muito errado! "mensagem de erro

154
00:06:58,980 --> 00:07:01,420
‫com o 500, e isso

155
00:07:01,420 --> 00:07:03,560
‫também porque ainda estamos

156
00:07:03,560 --> 00:07:05,820
‫no modo de produção, ok?

157
00:07:05,820 --> 00:07:08,990
‫Mas, de qualquer forma, receber esta mensagem aqui, lembre-se,

158
00:07:08,990 --> 00:07:12,120
‫significa que temos um erro não operacional aqui.

159
00:07:12,120 --> 00:07:15,630
‫Então, basicamente, um erro que não criamos nós mesmos.

160
00:07:15,630 --> 00:07:19,580
‫E então, bem isso, agora entramos

161
00:07:19,580 --> 00:07:24,380
‫aqui no nosso errorController, vamos bem aqui, certo?

162
00:07:24,380 --> 00:07:28,780
‫Então, neste outro ramo aqui na função sendErrorProd.

163
00:07:28,780 --> 00:07:30,380
‫E na verdade você

164
00:07:30,380 --> 00:07:32,970
‫vê o erro aqui no console também, ok?

165
00:07:32,970 --> 00:07:35,600
‫E é isso que acontece quando

166
00:07:35,600 --> 00:07:39,430
‫há um erro dentro de qualquer middleware Express, certo?

167
00:07:39,430 --> 00:07:41,370
‫Portanto, o Express, quando houver um

168
00:07:41,370 --> 00:07:44,480
‫erro, irá automaticamente para o middleware de tratamento de erros

169
00:07:44,480 --> 00:07:46,330
‫com esse erro, certo?

170
00:07:46,330 --> 00:07:48,100
‫E é por isso

171
00:07:48,100 --> 00:07:50,410
‫que quando obtemos um erro aqui em

172
00:07:50,410 --> 00:07:55,240
‫qualquer uma de nossas funções de middleware, ele vai imediatamente para este manipulador, ok?

173
00:07:55,240 --> 00:07:56,520
‫E como estamos

174
00:07:56,520 --> 00:07:58,730
‫em produção, ele vai entrar neste

175
00:07:58,730 --> 00:08:00,994
‫bloco aqui, mas como não é um

176
00:08:00,994 --> 00:08:03,700
‫CastError, e não é esse erro, e não

177
00:08:03,700 --> 00:08:06,830
‫é um ValidationError, então, assim que o erro for

178
00:08:06,830 --> 00:08:09,640
‫realmente enviado, bem aqui, entramos neste bloco .

179
00:08:09,640 --> 00:08:14,640
‫E de novo, é por isso que enviamos esse erro genérico, certo?

180
00:08:15,235 --> 00:08:17,500
‫Agora vamos sair desse modo aqui

181
00:08:17,500 --> 00:08:20,053
‫e voltar ao início normal do npm.

182
00:08:22,310 --> 00:08:26,130
‫E então agora, nosso erro será enviado assim, certo?

183
00:08:26,130 --> 00:08:29,440
‫Portanto, enviar erro de desenvolvimento nos dará todos os detalhes

184
00:08:29,440 --> 00:08:31,773
‫sobre o erro que está ocorrendo.

185
00:08:33,610 --> 00:08:38,490
‫E agora, de fato, obtemos ReferenceError: x não está definido.

186
00:08:38,490 --> 00:08:39,323
‫OK?

187
00:08:39,323 --> 00:08:41,533
‫Então, no app. js, linha 21.

188
00:08:42,480 --> 00:08:46,300
‫E então, a linha 21 está onde está, mas vamos

189
00:08:46,300 --> 00:08:47,520
‫nos livrar dela.

190
00:08:47,520 --> 00:08:49,760
‫Eu só queria mostrar para você.

191
00:08:49,760 --> 00:08:51,350
‫OK?

192
00:08:51,350 --> 00:08:53,770
‫De qualquer forma, com isso, na verdade fechamos

193
00:08:53,770 --> 00:08:55,620
‫nossa seção de tratamento de erros.

194
00:08:55,620 --> 00:08:58,830
‫E poderia haver um curso inteiro sobre tratamento de

195
00:08:58,830 --> 00:09:01,940
‫erros com Node e Express, porque realmente é

196
00:09:01,940 --> 00:09:03,830
‫um tópico extremamente complexo.

197
00:09:03,830 --> 00:09:06,470
‫Mas, nesta seção, você aprenderá o básico

198
00:09:06,470 --> 00:09:08,830
‫que precisa saber para realmente começar

199
00:09:08,830 --> 00:09:10,943
‫a criar aplicativos incríveis.

