﻿1
00:00:01,070 --> 00:00:01,950
‫Instructeur : D'accord !

2
00:00:01,950 --> 00:00:04,040
‫Et maintenant, pour terminer cette

3
00:00:04,040 --> 00:00:07,043
‫section, apprenons à intercepter les exceptions non interceptées.

4
00:00:08,660 --> 00:00:11,930
‫Mais que sont exactement les exceptions non capturées ?

5
00:00:11,930 --> 00:00:15,290
‫Eh bien, toutes les erreurs, ou appelons-les aussi bogues, qui se

6
00:00:15,290 --> 00:00:17,280
‫produisent dans notre code synchrone

7
00:00:17,280 --> 00:00:21,230
‫mais qui ne sont gérées nulle part sont appelées exceptions non interceptées.

8
00:00:21,230 --> 00:00:25,340
‫Et comme avant, tout comme pour les rejets non gérés, nous avons

9
00:00:25,340 --> 00:00:28,730
‫également un moyen de gérer les exceptions non interceptées.

10
00:00:28,730 --> 00:00:30,720
‫Permettez-moi donc de vous montrer

11
00:00:30,720 --> 00:00:32,823
‫rapidement un exemple d'exception non détectée.

12
00:00:34,370 --> 00:00:37,400
‫Imaginons donc simplement que nous essayons

13
00:00:37,400 --> 00:00:40,423
‫de consoler. enregistrer quelque chose qui n'existe pas.

14
00:00:42,110 --> 00:00:46,600
‫Et donc tout de suite, nous obtenons cette erreur ici, x n'est pas défini,

15
00:00:46,600 --> 00:00:50,080
‫puis par défaut, nous obtenons ici toute cette trace de

16
00:00:50,080 --> 00:00:51,960
‫pile imprimée sur la console.

17
00:00:51,960 --> 00:00:52,793
‫D'accord.

18
00:00:52,793 --> 00:00:57,660
‫Et maintenant, pour résoudre ce problème, c'est très similaire à faire les

19
00:00:57,660 --> 00:00:59,380
‫rejets non gérés.

20
00:00:59,380 --> 00:01:02,040
‫Encore une fois, nous écoutons un événement,

21
00:01:02,040 --> 00:01:04,040
‫cette fois il s'appelle uncaughtException.

22
00:01:08,662 --> 00:01:11,912
‫Et bien sûr, il doit être entre guillemets.

23
00:01:12,840 --> 00:01:17,390
‫Et puis comme avant, nous passons notre fonction de rappel.

24
00:01:17,390 --> 00:01:18,223
‫D'accord.

25
00:01:18,223 --> 00:01:20,960
‫Et maintenant, en fait, ce que nous faisons ici est très similaire à

26
00:01:20,960 --> 00:01:22,350
‫ce que nous avons fait ici.

27
00:01:22,350 --> 00:01:24,970
‫Nous voulons donc verrouiller l'erreur sur la

28
00:01:24,970 --> 00:01:29,690
‫console afin qu'elle apparaisse ensuite dans les journaux de notre serveur, d'accord ?

29
00:01:29,690 --> 00:01:32,430
‫Donc, nous donner un moyen de résoudre le problème.

30
00:01:32,430 --> 00:01:35,223
‫Et puis nous voulons arrêter gracieusement le serveur.

31
00:01:36,750 --> 00:01:39,010
‫Alors, en fait, je veux

32
00:01:39,010 --> 00:01:41,590
‫imprimer toute l'erreur sur la console, et

33
00:01:41,590 --> 00:01:43,940
‫pas seulement le message, d'accord ?

34
00:01:43,940 --> 00:01:45,993
‫Et modifions aussi l'ordre ici,

35
00:01:47,300 --> 00:01:48,660
‫mais c'est tout.

36
00:01:48,660 --> 00:01:50,140
‫Donc pour le reste c'est pareil.

37
00:01:50,140 --> 00:01:51,290
‫Et

38
00:01:53,310 --> 00:01:58,310
‫ici, c'est bien sûr INSCRIVEZ-VOUS D'EXCEPTION !

39
00:01:58,320 --> 00:02:01,810
‫Maintenant, je pourrais refactoriser ceci ici dans une fonction

40
00:02:01,810 --> 00:02:05,020
‫agréable, mais gardons-le comme ça, d'accord ?

41
00:02:05,020 --> 00:02:07,123
‫D'accord, alors réexécutons maintenant ceci.

42
00:02:08,330 --> 00:02:11,090
‫Et donc jetons un coup d'œil à ce que nous avons ici.

43
00:02:11,090 --> 00:02:13,700
‫Et en effet, nous voyons maintenant l'EXCEPTION IMPOSSIBLE !

44
00:02:13,700 --> 00:02:14,780
‫Éteindre.

45
00:02:14,780 --> 00:02:15,750
‫D'accord?

46
00:02:15,750 --> 00:02:18,770
‫Et en fait, cela imprime à nouveau toute la pile sur

47
00:02:18,770 --> 00:02:21,400
‫la console, mais je ne le veux pas vraiment.

48
00:02:21,400 --> 00:02:22,660
‫Je n'aime pas ça.

49
00:02:22,660 --> 00:02:25,860
‫Alors revenons en fait à ce que nous avions ici.

50
00:02:25,860 --> 00:02:28,683
‫Alors errez. nom et puis erreur. un message.

51
00:02:30,890 --> 00:02:32,610
‫D'accord, et maintenant nous

52
00:02:32,610 --> 00:02:36,290
‫avons la ReferenceError que x n'est pas défini, d'accord ?

53
00:02:36,290 --> 00:02:38,520
‫Et mettons simplement la même chose ici.

54
00:02:38,520 --> 00:02:39,983
‫Alors comme avant.

55
00:02:40,950 --> 00:02:41,783
‫D'accord.

56
00:02:41,783 --> 00:02:43,070
‫Et c'est en fait tout

57
00:02:43,070 --> 00:02:45,370
‫ce qu'il y a à attraper les exceptions non capturées.

58
00:02:45,370 --> 00:02:48,180
‫Maintenant, alors qu'ici dans le rejet non géré,

59
00:02:48,180 --> 00:02:51,230
‫le plantage de l'application comme nous l'avons fait ici

60
00:02:51,230 --> 00:02:53,630
‫est facultatif, lorsqu'il y a une exception

61
00:02:53,630 --> 00:02:57,150
‫non interceptée, nous devons vraiment, vraiment planter notre application car après

62
00:02:57,150 --> 00:02:59,970
‫qu'il y ait eu une exception non interceptée, l'ensemble

63
00:02:59,970 --> 00:03:01,610
‫du processus de nœud

64
00:03:01,610 --> 00:03:04,370
‫est dans un -appelé état impur, d'accord ?

65
00:03:04,370 --> 00:03:07,770
‫Et donc pour résoudre ce problème, le processus doit se

66
00:03:07,770 --> 00:03:09,940
‫terminer puis être redémarré, d'accord ?

67
00:03:09,940 --> 00:03:11,330
‫Et encore, en

68
00:03:11,330 --> 00:03:13,460
‫production, nous devrions alors avoir un

69
00:03:13,460 --> 00:03:16,640
‫outil en place qui redémarrera l'application après un crash.

70
00:03:16,640 --> 00:03:19,270
‫Et de nombreux services d'hébergement le font

71
00:03:19,270 --> 00:03:20,860
‫déjà, d'accord ?

72
00:03:20,860 --> 00:03:23,170
‫Donc, complètement automatiquement sans que nous ayons à

73
00:03:23,170 --> 00:03:24,980
‫faire quoi que ce soit.

74
00:03:24,980 --> 00:03:27,820
‫Maintenant, dans Node. js, ce n'est pas

75
00:03:27,820 --> 00:03:31,580
‫vraiment une bonne pratique de se fier aveuglément à ces deux gestionnaires

76
00:03:31,580 --> 00:03:34,170
‫d'erreurs que nous venons d'implémenter ici, d'accord ?

77
00:03:34,170 --> 00:03:36,470
‫Donc, idéalement, les erreurs devraient vraiment être traitées

78
00:03:36,470 --> 00:03:38,120
‫là où elles se produisent.

79
00:03:38,120 --> 00:03:42,150
‫Ainsi, par exemple, dans le problème de connexion à la base de données, nous

80
00:03:42,150 --> 00:03:44,660
‫devrions bien sûr y ajouter un gestionnaire de capture

81
00:03:44,660 --> 00:03:46,480
‫et ne pas simplement nous

82
00:03:46,480 --> 00:03:50,160
‫fier au rappel de rejet non géré que nous avons ici, d'accord ?

83
00:03:50,160 --> 00:03:53,600
‫Et certaines personnes disent même que nous ne devrions pas les utiliser du tout, mais je ne

84
00:03:53,600 --> 00:03:54,770
‫suis pas d'accord avec cela.

85
00:03:54,770 --> 00:03:58,090
‫Je pense qu'en tant que filet de sécurité, disons,

86
00:03:58,090 --> 00:04:02,470
‫ils peuvent être très utiles et jouer un rôle dans notre application.

87
00:04:02,470 --> 00:04:04,020
‫En fait, ce gestionnaire

88
00:04:04,020 --> 00:04:07,300
‫ici devrait être tout en haut de notre code, d'accord ?

89
00:04:07,300 --> 00:04:11,280
‫Ou du moins avant que tout autre code ne soit réellement exécuté.

90
00:04:11,280 --> 00:04:14,980
‫Parce que regardez ce qui se passe si je déplace cette ligne de

91
00:04:14,980 --> 00:04:16,513
‫code ici avant ce gestionnaire.

92
00:04:17,350 --> 00:04:19,593
‫Donc, si je le mets ici, par

93
00:04:21,140 --> 00:04:23,070
‫exemple, puis que je le sauve,

94
00:04:23,070 --> 00:04:24,680
‫alors vous voyez en

95
00:04:24,680 --> 00:04:29,410
‫fait que notre gestionnaire n'attrape pas cette exception, donc cette erreur ici, n'est-ce pas ?

96
00:04:29,410 --> 00:04:31,830
‫Et c'est parce que ce n'est qu'ici à

97
00:04:31,830 --> 00:04:35,010
‫la fin que nous commençons à écouter une exception non capturée.

98
00:04:35,010 --> 00:04:37,580
‫Mais dans ce cas ici, l'exception non capturée

99
00:04:37,580 --> 00:04:40,380
‫se produit avant même que nous écoutions cet événement.

100
00:04:40,380 --> 00:04:44,630
‫Et donc par conséquent, nous n'avons aucun moyen de l'attraper, n'est-ce pas ?

101
00:04:44,630 --> 00:04:48,920
‫Et donc idéalement, nous devrions le mettre ici, tout en haut, à nouveau avant

102
00:04:48,920 --> 00:04:51,030
‫que tout autre code ne s'exécute.

103
00:04:51,030 --> 00:04:53,423
‫Surtout celui de notre application.

104
00:04:54,580 --> 00:04:57,760
‫Alors mettons-le en fait ici.

105
00:04:57,760 --> 00:04:59,550
‫Maintenant, le problème ici

106
00:04:59,550 --> 00:05:02,820
‫sera que le serveur n'est pas défini à ce stade.

107
00:05:02,820 --> 00:05:04,160
‫Mais ce n'est pas

108
00:05:04,160 --> 00:05:06,180
‫un problème, car en fait, nous n'avons pas

109
00:05:06,180 --> 00:05:08,060
‫du tout besoin du serveur ici, d'accord ?

110
00:05:08,060 --> 00:05:09,480
‫Et c'est parce que

111
00:05:09,480 --> 00:05:11,270
‫ces erreurs, donc ces exceptions non

112
00:05:11,270 --> 00:05:13,670
‫détectées, ne se produiront pas de manière asynchrone.

113
00:05:13,670 --> 00:05:15,630
‫Donc, ils n'auront rien à

114
00:05:15,630 --> 00:05:17,660
‫voir avec le serveur en fait.

115
00:05:17,660 --> 00:05:19,360
‫Nous n'avons donc pas du tout besoin de ça ici.

116
00:05:20,470 --> 00:05:22,250
‫Nous pouvons simplement l'enregistrer ici,

117
00:05:22,250 --> 00:05:25,480
‫et nous l'avons maintenant avant d'avoir réellement besoin de

118
00:05:25,480 --> 00:05:26,890
‫notre application principale.

119
00:05:26,890 --> 00:05:28,663
‫Et donc si nous avons maintenant

120
00:05:29,940 --> 00:05:31,850
‫une erreur, essayons d'abord ici, donc

121
00:05:31,850 --> 00:05:33,500
‫vous voyez que maintenant

122
00:05:33,500 --> 00:05:36,710
‫nous sommes de nouveau à l'attraper dans notre gestionnaire d'erreurs.

123
00:05:36,710 --> 00:05:41,333
‫Mais si nous avions maintenant ce code, par exemple dans app. js, disons que cela n'a

124
00:05:42,350 --> 00:05:45,810
‫pas vraiment d'importance, disons simplement que c'est ici, et

125
00:05:45,810 --> 00:05:47,410
‫si nous l'exécutons

126
00:05:47,410 --> 00:05:50,260
‫maintenant, alors vous voyez que nous attrapons

127
00:05:50,260 --> 00:05:52,530
‫toujours cette exception dans notre

128
00:05:52,530 --> 00:05:56,290
‫gestionnaire d'erreurs, ce qui n'était pas le cas auparavant.

129
00:05:56,290 --> 00:05:57,180
‫D'accord?

130
00:05:57,180 --> 00:05:59,590
‫Et maintenant juste pour

131
00:05:59,590 --> 00:06:03,120
‫une expérience, que pensez-vous si nous mettons ce

132
00:06:03,120 --> 00:06:06,100
‫code ici dans cette fonction middleware ?

133
00:06:06,100 --> 00:06:07,690
‫À votre avis, que va-t-il se

134
00:06:07,690 --> 00:06:09,510
‫passer lorsque nous enregistrerons ce fichier maintenant ?

135
00:06:09,510 --> 00:06:12,200
‫Donc x n'est toujours défini nulle part, mais regardons

136
00:06:12,200 --> 00:06:13,840
‫ce qui se passe lorsque nous

137
00:06:13,840 --> 00:06:15,373
‫exécutons maintenant ce code.

138
00:06:16,980 --> 00:06:19,510
‫Et maintenant, nous n'avons en fait aucune erreur.

139
00:06:19,510 --> 00:06:21,300
‫Ou en fait, nous le

140
00:06:21,300 --> 00:06:24,130
‫faisons, mais c'est uniquement à cause de notre rejet non géré,

141
00:06:24,130 --> 00:06:26,020
‫qui est dû au fait que notre

142
00:06:26,020 --> 00:06:27,920
‫mot de passe ici est toujours faux.

143
00:06:29,290 --> 00:06:32,170
‫Donc, si nous sauvegardons cela et maintenant le sauvegardons à nouveau,

144
00:06:32,170 --> 00:06:34,560
‫vous ne devriez voir aucune erreur du tout.

145
00:06:34,560 --> 00:06:35,730
‫Et en effet, nous ne le faisons pas.

146
00:06:35,730 --> 00:06:36,953
‫Et pourquoi est-ce que?

147
00:06:37,830 --> 00:06:40,940
‫Eh bien, c'est parce que cette fonction middleware ici bien sûr

148
00:06:40,940 --> 00:06:42,450
‫n'est appelée que dès

149
00:06:42,450 --> 00:06:45,220
‫qu'il y a réellement une demande, n'est-ce pas ?

150
00:06:45,220 --> 00:06:48,113
‫Et voyons donc ce qui se passe lorsque nous faisons une requête.

151
00:06:50,760 --> 00:06:54,180
‫Et alors faisons une demande Get All Tours.

152
00:06:54,180 --> 00:06:55,720
‫Et attendons-le.

153
00:06:55,720 --> 00:06:58,980
‫Et, ici, nous obtenons un "Quelque chose s'est très mal passé ! " message d'erreur

154
00:06:58,980 --> 00:07:01,420
‫avec le 500, et c'est aussi

155
00:07:01,420 --> 00:07:03,560
‫parce qu'on est toujours

156
00:07:03,560 --> 00:07:05,820
‫en mode production, d'accord ?

157
00:07:05,820 --> 00:07:08,990
‫Mais de toute façon, recevoir ce message ici, rappelez-vous, signifie

158
00:07:08,990 --> 00:07:12,120
‫que nous avons une erreur non opérationnelle ici.

159
00:07:12,120 --> 00:07:15,630
‫Donc en gros une erreur que nous n'avons pas créée nous-mêmes.

160
00:07:15,630 --> 00:07:19,580
‫Et donc, c'est ça, nous entrons maintenant

161
00:07:19,580 --> 00:07:24,380
‫ici dans notre errorController, nous allons ici, n'est-ce pas ?

162
00:07:24,380 --> 00:07:28,780
‫Donc, dans cette branche else ici dans la fonction sendErrorProd.

163
00:07:28,780 --> 00:07:30,380
‫Et en fait, vous

164
00:07:30,380 --> 00:07:32,970
‫voyez également l'erreur ici dans la console, d'accord ?

165
00:07:32,970 --> 00:07:35,600
‫Et c'est ce qui se passe lorsqu'il

166
00:07:35,600 --> 00:07:39,430
‫y a une erreur à l'intérieur d'un middleware Express, n'est-ce pas ?

167
00:07:39,430 --> 00:07:41,370
‫Donc, Express, en cas d'erreur,

168
00:07:41,370 --> 00:07:44,480
‫ira automatiquement au middleware de gestion des erreurs avec

169
00:07:44,480 --> 00:07:46,330
‫cette erreur, d'accord ?

170
00:07:46,330 --> 00:07:48,100
‫Et c'est pourquoi, lorsque

171
00:07:48,100 --> 00:07:50,410
‫nous obtenons une erreur ici dans

172
00:07:50,410 --> 00:07:55,240
‫l'une de nos fonctions middleware, elle ira immédiatement ici dans ce gestionnaire, d'accord ?

173
00:07:55,240 --> 00:07:56,520
‫Et comme on

174
00:07:56,520 --> 00:07:58,730
‫est en production, ça va entrer

175
00:07:58,730 --> 00:08:00,994
‫ce bloc ici, mais comme ce n'est

176
00:08:00,994 --> 00:08:03,700
‫pas une CastError, et pas cette erreur, et

177
00:08:03,700 --> 00:08:06,830
‫pas une ValidationError, alors dès que l'erreur est effectivement envoyée,

178
00:08:06,830 --> 00:08:09,640
‫ici même, on entre alors dans ce bloc .

179
00:08:09,640 --> 00:08:14,640
‫Et encore une fois, c'est pourquoi nous envoyons cette erreur générique, d'accord ?

180
00:08:15,235 --> 00:08:17,500
‫Quittons maintenant ce mode ici et

181
00:08:17,500 --> 00:08:20,053
‫revenons à notre démarrage normal de npm.

182
00:08:22,310 --> 00:08:26,130
‫Et donc maintenant, notre erreur sera envoyée comme ça, n'est-ce pas ?

183
00:08:26,130 --> 00:08:29,440
‫Donc, envoyer une erreur de développement nous donnera tous les

184
00:08:29,440 --> 00:08:31,773
‫détails sur l'erreur qui se produit.

185
00:08:33,610 --> 00:08:38,490
‫Et maintenant, en effet, nous obtenons ReferenceError : x n'est pas défini.

186
00:08:38,490 --> 00:08:39,323
‫D'accord?

187
00:08:39,323 --> 00:08:41,533
‫Donc dans l'appli. js, ligne 21.

188
00:08:42,480 --> 00:08:46,300
‫Et donc, la ligne 21 est là où elle se trouve,

189
00:08:46,300 --> 00:08:47,520
‫mais débarrassons-nous en.

190
00:08:47,520 --> 00:08:49,760
‫Je voulais juste te le montrer.

191
00:08:49,760 --> 00:08:51,350
‫D'accord?

192
00:08:51,350 --> 00:08:53,770
‫Quoi qu'il en soit, avec cela, nous fermons en fait

193
00:08:53,770 --> 00:08:55,620
‫notre section de gestion des erreurs.

194
00:08:55,620 --> 00:08:58,830
‫Et il pourrait y avoir un cours complet sur la

195
00:08:58,830 --> 00:09:01,940
‫gestion des erreurs avec Node et Express, car c'est

196
00:09:01,940 --> 00:09:03,830
‫vraiment un sujet incroyablement complexe.

197
00:09:03,830 --> 00:09:06,470
‫Mais, dans cette section, vous apprenez les éléments

198
00:09:06,470 --> 00:09:08,830
‫essentiels que vous devez connaître pour vraiment

199
00:09:08,830 --> 00:09:10,943
‫commencer à créer des applications étonnantes.

