﻿1
00:00:01,070 --> 00:00:01,950
‫Lehrer: Alles klar!

2
00:00:01,950 --> 00:00:04,040
‫Und jetzt, um diesen Abschnitt

3
00:00:04,040 --> 00:00:07,043
‫abzuschließen, lernen wir, wie man nicht abgefangene Ausnahmen abfängt.

4
00:00:08,660 --> 00:00:11,930
‫Aber was genau sind nicht erfasste Ausnahmen?

5
00:00:11,930 --> 00:00:15,290
‫Nun, alle Fehler, oder nennen wir sie auch Bugs,

6
00:00:15,290 --> 00:00:17,280
‫die in unserem synchronen Code

7
00:00:17,280 --> 00:00:21,230
‫auftreten, aber nirgendwo behandelt werden, werden als nicht abgefangene Ausnahmen bezeichnet.

8
00:00:21,230 --> 00:00:25,340
‫Und wie zuvor, so wie bei den unbehandelten Ablehnungen, haben wir

9
00:00:25,340 --> 00:00:28,730
‫auch eine Möglichkeit, nicht abgefangene Ausnahmen zu behandeln.

10
00:00:28,730 --> 00:00:30,720
‫Lassen Sie mich Ihnen also schnell

11
00:00:30,720 --> 00:00:32,823
‫ein Beispiel für eine nicht abgefangene Ausnahme zeigen.

12
00:00:34,370 --> 00:00:37,400
‫Also tun wir einfach so, als wollten

13
00:00:37,400 --> 00:00:40,423
‫wir trösten. log etwas, das nicht existiert.

14
00:00:42,110 --> 00:00:46,600
‫Und so erhalten wir sofort diesen Fehler hier, x ist nicht definiert,

15
00:00:46,600 --> 00:00:50,080
‫und dann erhalten wir standardmäßig diesen gesamten Stack-Trace hier

16
00:00:50,080 --> 00:00:51,960
‫auf der Konsole gedruckt.

17
00:00:51,960 --> 00:00:52,793
‫Gut.

18
00:00:52,793 --> 00:00:57,660
‫Und nun, um dies zu beheben, ist dies sehr ähnlich wie bei

19
00:00:57,660 --> 00:00:59,380
‫den unbehandelten Ablehnungen.

20
00:00:59,380 --> 00:01:02,040
‫Wir hören also wieder auf ein Ereignis,

21
00:01:02,040 --> 00:01:04,040
‫dieses Mal heißt es uncaughtException.

22
00:01:08,662 --> 00:01:11,912
‫Und natürlich muss es in Anführungszeichen stehen.

23
00:01:12,840 --> 00:01:17,390
‫Und dann übergeben wir wie zuvor unsere Callback-Funktion.

24
00:01:17,390 --> 00:01:18,223
‫Okay.

25
00:01:18,223 --> 00:01:20,960
‫Und jetzt ist das, was wir hier tun, sehr ähnlich zu dem,

26
00:01:20,960 --> 00:01:22,350
‫was wir hier gemacht haben.

27
00:01:22,350 --> 00:01:24,970
‫Also wollen wir den Fehler auf die

28
00:01:24,970 --> 00:01:29,690
‫Konsole sperren, damit er dann in den Logs auf unserem Server auftaucht, okay?

29
00:01:29,690 --> 00:01:32,430
‫So geben Sie uns eine Möglichkeit, das Problem dann zu beheben.

30
00:01:32,430 --> 00:01:35,223
‫Und dann wollen wir den Server ordnungsgemäß herunterfahren.

31
00:01:36,750 --> 00:01:39,010
‫Also, nun, eigentlich möchte ich

32
00:01:39,010 --> 00:01:41,590
‫hier den gesamten Fehler an die Konsole

33
00:01:41,590 --> 00:01:43,940
‫ausgeben und nicht nur die Nachricht, okay?

34
00:01:43,940 --> 00:01:45,993
‫Und ändern wir auch hier die Reihenfolge,

35
00:01:47,300 --> 00:01:48,660
‫aber das war's.

36
00:01:48,660 --> 00:01:50,140
‫Der Rest ist also gleich.

37
00:01:50,140 --> 00:01:51,290
‫Und

38
00:01:53,310 --> 00:01:58,310
‫hier ist es natürlich UNCUGHT EXCEPTION!

39
00:01:58,320 --> 00:02:01,810
‫Jetzt könnte ich das hier in eine nette Funktion umwandeln,

40
00:02:01,810 --> 00:02:05,020
‫aber belassen wir es einfach so, in Ordnung?

41
00:02:05,020 --> 00:02:07,123
‫Okay, also lassen Sie uns das jetzt wiederholen.

42
00:02:08,330 --> 00:02:11,090
‫Schauen wir uns also an, was wir hier haben.

43
00:02:11,090 --> 00:02:13,700
‫Und tatsächlich sehen wir jetzt UNCUGHT EXCEPTION!

44
00:02:13,700 --> 00:02:14,780
‫Herunterfahren.

45
00:02:14,780 --> 00:02:15,750
‫Gut?

46
00:02:15,750 --> 00:02:18,770
‫Und tatsächlich druckt dies wieder den gesamten Stack auf die

47
00:02:18,770 --> 00:02:21,400
‫Konsole, aber das möchte ich nicht wirklich.

48
00:02:21,400 --> 00:02:22,660
‫Ich mag das nicht.

49
00:02:22,660 --> 00:02:25,860
‫Kommen wir also einfach zu dem zurück, was wir hier hatten.

50
00:02:25,860 --> 00:02:28,683
‫Also irr. Name und dann Fehler. Botschaft.

51
00:02:30,890 --> 00:02:32,610
‫Okay, und jetzt haben

52
00:02:32,610 --> 00:02:36,290
‫wir den ReferenceError, dass x nicht definiert ist, okay?

53
00:02:36,290 --> 00:02:38,520
‫Und lassen Sie uns das gleiche hier setzen.

54
00:02:38,520 --> 00:02:39,983
‫Also genau wie früher.

55
00:02:40,950 --> 00:02:41,783
‫Gut.

56
00:02:41,783 --> 00:02:43,070
‫Und das ist

57
00:02:43,070 --> 00:02:45,370
‫eigentlich alles, um unabgefangene Ausnahmen abzufangen.

58
00:02:45,370 --> 00:02:48,180
‫Während hier in der unbehandelten Ablehnung das

59
00:02:48,180 --> 00:02:51,230
‫Abstürzen der Anwendung wie hier optional ist, müssen

60
00:02:51,230 --> 00:02:53,630
‫wir bei einer nicht abgefangenen Ausnahme

61
00:02:53,630 --> 00:02:57,150
‫unsere Anwendung wirklich, wirklich abstürzen, denn nachdem eine nicht

62
00:02:57,150 --> 00:02:59,970
‫abgefangene Ausnahme aufgetreten ist, befindet sich der gesamte

63
00:02:59,970 --> 00:03:01,610
‫Knotenprozess in einem

64
00:03:01,610 --> 00:03:04,370
‫Zustand - sogenannter unreiner Zustand, in Ordnung?

65
00:03:04,370 --> 00:03:07,770
‫Um das zu beheben, muss der Prozess beendet und dann

66
00:03:07,770 --> 00:03:09,940
‫neu gestartet werden, in Ordnung?

67
00:03:09,940 --> 00:03:11,330
‫Und wieder, in

68
00:03:11,330 --> 00:03:13,460
‫der Produktion sollten wir dann ein

69
00:03:13,460 --> 00:03:16,640
‫Tool haben, das die Anwendung nach einem Absturz neu startet.

70
00:03:16,640 --> 00:03:19,270
‫Und viele Hosting-Dienste tun dies bereits out of

71
00:03:19,270 --> 00:03:20,860
‫the box, in Ordnung?

72
00:03:20,860 --> 00:03:23,170
‫Also ganz automatisch, ohne dass wir

73
00:03:23,170 --> 00:03:24,980
‫etwas tun müssen.

74
00:03:24,980 --> 00:03:27,820
‫Jetzt in Node. js, es ist

75
00:03:27,820 --> 00:03:31,580
‫nicht wirklich empfehlenswert, sich blind auf diese beiden Fehlerhandler zu verlassen,

76
00:03:31,580 --> 00:03:34,170
‫die wir gerade hier implementiert haben, okay?

77
00:03:34,170 --> 00:03:36,470
‫Idealerweise sollten Fehler also wirklich dort behandelt

78
00:03:36,470 --> 00:03:38,120
‫werden, wo sie auftreten.

79
00:03:38,120 --> 00:03:42,150
‫So sollten wir zum Beispiel beim Verbindungsproblem mit der Datenbank

80
00:03:42,150 --> 00:03:44,660
‫natürlich dort einen Catch-Handler hinzufügen und

81
00:03:44,660 --> 00:03:46,480
‫uns nicht einfach auf

82
00:03:46,480 --> 00:03:50,160
‫den unbehandelten Zurückweisungs-Callback verlassen, den wir hier haben, okay?

83
00:03:50,160 --> 00:03:53,600
‫Und manche Leute sagen sogar, dass wir diese überhaupt nicht verwenden sollten, aber dem

84
00:03:53,600 --> 00:03:54,770
‫stimme ich nicht zu.

85
00:03:54,770 --> 00:03:58,090
‫Ich denke, dass sie als Sicherheitsnetz, sagen wir,

86
00:03:58,090 --> 00:04:02,470
‫sehr nützlich sein können und eine Rolle in unserer Anwendung spielen.

87
00:04:02,470 --> 00:04:04,020
‫Eigentlich sollte dieser

88
00:04:04,020 --> 00:04:07,300
‫Handler hier ganz oben in unserem Code stehen, okay?

89
00:04:07,300 --> 00:04:11,280
‫Oder zumindest bevor irgendein anderer Code wirklich ausgeführt wird.

90
00:04:11,280 --> 00:04:14,980
‫Denn beobachten Sie, was passiert, wenn ich diese Codezeile hier

91
00:04:14,980 --> 00:04:16,513
‫vor diesen Handler schiebe.

92
00:04:17,350 --> 00:04:19,593
‫Wenn ich es also zum Beispiel

93
00:04:21,140 --> 00:04:23,070
‫hier platziere und dann speichere,

94
00:04:23,070 --> 00:04:24,680
‫dann sehen Sie

95
00:04:24,680 --> 00:04:29,410
‫tatsächlich, dass unser Handler diese Ausnahme nicht abfängt, also diesen Fehler hier, oder?

96
00:04:29,410 --> 00:04:31,830
‫Und das liegt daran, dass wir

97
00:04:31,830 --> 00:04:35,010
‫erst hier am Ende tatsächlich auf eine unaufgefangene Ausnahme lauschen.

98
00:04:35,010 --> 00:04:37,580
‫Aber in diesem Fall hier tritt die nicht

99
00:04:37,580 --> 00:04:40,380
‫abgefangene Ausnahme auf, bevor wir dieses Ereignis überhaupt hören.

100
00:04:40,380 --> 00:04:44,630
‫Und deshalb haben wir keine Möglichkeit, es zu fangen, oder?

101
00:04:44,630 --> 00:04:48,920
‫Also sollten wir es idealerweise hier ganz oben platzieren, bevor

102
00:04:48,920 --> 00:04:51,030
‫anderer Code ausgeführt wird.

103
00:04:51,030 --> 00:04:53,423
‫Vor allem die in unserer Bewerbung.

104
00:04:54,580 --> 00:04:57,760
‫Also lassen Sie es uns hier richtig sagen.

105
00:04:57,760 --> 00:04:59,550
‫Das Problem hier wird nun

106
00:04:59,550 --> 00:05:02,820
‫sein, dass der Server zu diesem Zeitpunkt noch nicht definiert ist.

107
00:05:02,820 --> 00:05:04,160
‫Aber das ist

108
00:05:04,160 --> 00:05:06,180
‫kein Problem, denn eigentlich brauchen wir

109
00:05:06,180 --> 00:05:08,060
‫den Server hier gar nicht, oder?

110
00:05:08,060 --> 00:05:09,480
‫Und das liegt

111
00:05:09,480 --> 00:05:11,270
‫daran, dass diese Fehler, also

112
00:05:11,270 --> 00:05:13,670
‫diese nicht abgefangenen Ausnahmen, nicht asynchron auftreten.

113
00:05:13,670 --> 00:05:15,630
‫Sie werden also nichts

114
00:05:15,630 --> 00:05:17,660
‫mit dem Server zu tun haben.

115
00:05:17,660 --> 00:05:19,360
‫Das brauchen wir hier also gar nicht.

116
00:05:20,470 --> 00:05:22,250
‫Wir können es einfach

117
00:05:22,250 --> 00:05:25,480
‫hier speichern und haben es jetzt, bevor wir unsere

118
00:05:25,480 --> 00:05:26,890
‫Hauptanwendung tatsächlich benötigen.

119
00:05:26,890 --> 00:05:28,663
‫Wenn wir also jetzt einen

120
00:05:29,940 --> 00:05:31,850
‫Fehler haben, versuchen wir es zuerst

121
00:05:31,850 --> 00:05:33,500
‫hier, damit Sie

122
00:05:33,500 --> 00:05:36,710
‫sehen, dass wir ihn jetzt wieder in unserem Fehlerhandler abfangen.

123
00:05:36,710 --> 00:05:41,333
‫Aber wenn wir jetzt diesen Code hätten, zum Beispiel in der App. js, sagen wir, es spielt

124
00:05:42,350 --> 00:05:45,810
‫keine Rolle, sagen wir einfach, es ist hier,

125
00:05:45,810 --> 00:05:47,410
‫und wenn wir

126
00:05:47,410 --> 00:05:50,260
‫das jetzt ausführen, sehen Sie, dass wir

127
00:05:50,260 --> 00:05:52,530
‫immer noch diese Ausnahme in

128
00:05:52,530 --> 00:05:56,290
‫unserem Fehlerhandler abfangen, was vorher nicht der Fall war.

129
00:05:56,290 --> 00:05:57,180
‫Gut?

130
00:05:57,180 --> 00:05:59,590
‫Und jetzt nur für

131
00:05:59,590 --> 00:06:03,120
‫ein Experiment, was denken Sie, wenn wir diesen

132
00:06:03,120 --> 00:06:06,100
‫Code direkt hier in diese Middleware-Funktion einfügen?

133
00:06:06,100 --> 00:06:07,690
‫Was wird Ihrer Meinung nach

134
00:06:07,690 --> 00:06:09,510
‫passieren, wenn wir diese Datei jetzt speichern?

135
00:06:09,510 --> 00:06:12,200
‫x ist also immer noch nirgendwo definiert, aber schauen wir

136
00:06:12,200 --> 00:06:13,840
‫uns an, was passiert, wenn wir

137
00:06:13,840 --> 00:06:15,373
‫diesen Code jetzt ausführen.

138
00:06:16,980 --> 00:06:19,510
‫Und so haben wir jetzt eigentlich keinen Fehler mehr.

139
00:06:19,510 --> 00:06:21,300
‫Oder wir tun es

140
00:06:21,300 --> 00:06:24,130
‫tatsächlich, aber das liegt nur an unserer unbehandelten Ablehnung,

141
00:06:24,130 --> 00:06:26,020
‫die daran liegt, dass unser

142
00:06:26,020 --> 00:06:27,920
‫Passwort hier immer noch falsch ist.

143
00:06:29,290 --> 00:06:32,170
‫Wenn wir das also speichern und jetzt erneut speichern,

144
00:06:32,170 --> 00:06:34,560
‫sollten Sie überhaupt keinen Fehler sehen.

145
00:06:34,560 --> 00:06:35,730
‫Und das tun wir tatsächlich nicht.

146
00:06:35,730 --> 00:06:36,953
‫Und warum ist das?

147
00:06:37,830 --> 00:06:40,940
‫Nun, das liegt daran, dass diese Middleware-Funktion hier

148
00:06:40,940 --> 00:06:42,450
‫natürlich nur aufgerufen

149
00:06:42,450 --> 00:06:45,220
‫wird, sobald es tatsächlich eine Anfrage gibt, oder?

150
00:06:45,220 --> 00:06:48,113
‫Sehen wir uns an, was passiert, wenn wir eine Anfrage stellen.

151
00:06:50,760 --> 00:06:54,180
‫Lassen Sie uns also eine Get All Tours-Anfrage stellen.

152
00:06:54,180 --> 00:06:55,720
‫Und warten wir darauf.

153
00:06:55,720 --> 00:06:58,980
‫Und hier bekommen wir ein "Etwas ist sehr schief gelaufen! "Fehlermeldung beim

154
00:06:58,980 --> 00:07:01,420
‫500, und das liegt auch

155
00:07:01,420 --> 00:07:03,560
‫daran, dass wir noch

156
00:07:03,560 --> 00:07:05,820
‫im Produktionsmodus sind, okay?

157
00:07:05,820 --> 00:07:08,990
‫Aber wie auch immer, wenn Sie diese Nachricht hier erhalten, denken

158
00:07:08,990 --> 00:07:12,120
‫Sie daran, dass hier ein nicht betriebsbereiter Fehler vorliegt.

159
00:07:12,120 --> 00:07:15,630
‫Im Grunde also ein Fehler, den wir nicht selbst erstellt haben.

160
00:07:15,630 --> 00:07:19,580
‫Und so, genau das geben wir jetzt

161
00:07:19,580 --> 00:07:24,380
‫hier in unseren errorController ein, wir gehen gleich hier, oder?

162
00:07:24,380 --> 00:07:28,780
‫Also in diesen else-Zweig hier in der Funktion sendErrorProd.

163
00:07:28,780 --> 00:07:30,380
‫Und tatsächlich siehst du

164
00:07:30,380 --> 00:07:32,970
‫den Fehler auch hier unten in der Konsole, okay?

165
00:07:32,970 --> 00:07:35,600
‫Und das passiert, wenn

166
00:07:35,600 --> 00:07:39,430
‫ein Fehler in einer Express-Middleware auftritt, richtig?

167
00:07:39,430 --> 00:07:41,370
‫Wenn also ein Fehler

168
00:07:41,370 --> 00:07:44,480
‫auftritt, geht Express automatisch mit diesem Fehler

169
00:07:44,480 --> 00:07:46,330
‫zur Fehlerbehandlungs-Middleware, okay?

170
00:07:46,330 --> 00:07:48,100
‫Wenn wir hier

171
00:07:48,100 --> 00:07:50,410
‫in einer unserer Middleware-Funktionen einen

172
00:07:50,410 --> 00:07:55,240
‫Fehler erhalten, wird dieser daher sofort in diesen Handler geleitet, okay?

173
00:07:55,240 --> 00:07:56,520
‫Und da wir

174
00:07:56,520 --> 00:07:58,730
‫in der Produktion sind, wird es

175
00:07:58,730 --> 00:08:00,994
‫diesen Block hier eingeben, aber da es

176
00:08:00,994 --> 00:08:03,700
‫kein CastError ist, und nicht dieser Fehler und

177
00:08:03,700 --> 00:08:06,830
‫kein ValidationError, dann geben wir, sobald der Fehler tatsächlich

178
00:08:06,830 --> 00:08:09,640
‫gesendet wird, genau hier diesen Block ein .

179
00:08:09,640 --> 00:08:14,640
‫Und auch deshalb senden wir diesen generischen Fehler, in Ordnung?

180
00:08:15,235 --> 00:08:17,500
‫Lassen Sie uns nun diesen Modus hier

181
00:08:17,500 --> 00:08:20,053
‫tatsächlich verlassen und zu unserem normalen npm-Start zurückkehren.

182
00:08:22,310 --> 00:08:26,130
‫Und so wird unser Fehler jetzt so gesendet, oder?

183
00:08:26,130 --> 00:08:29,440
‫Senden Sie den Entwicklungsfehler, um uns alle Details

184
00:08:29,440 --> 00:08:31,773
‫zu dem aufgetretenen Fehler mitzuteilen.

185
00:08:33,610 --> 00:08:38,490
‫Und so erhalten wir jetzt tatsächlich ReferenceError: x ist nicht definiert.

186
00:08:38,490 --> 00:08:39,323
‫Okay?

187
00:08:39,323 --> 00:08:41,533
‫Also in App. js, Zeile 21.

188
00:08:42,480 --> 00:08:46,300
‫Zeile 21 ist also dort, wo sie ist, aber lassen Sie

189
00:08:46,300 --> 00:08:47,520
‫sie uns los.

190
00:08:47,520 --> 00:08:49,760
‫Ich wollte es dir nur zeigen.

191
00:08:49,760 --> 00:08:51,350
‫Okay?

192
00:08:51,350 --> 00:08:53,770
‫Wie auch immer, damit schließen wir tatsächlich

193
00:08:53,770 --> 00:08:55,620
‫unseren Abschnitt zur Fehlerbehandlung.

194
00:08:55,620 --> 00:08:58,830
‫Und es könnte einen ganzen Kurs zur Fehlerbehandlung mit

195
00:08:58,830 --> 00:09:01,940
‫Node und Express geben, denn es ist wirklich

196
00:09:01,940 --> 00:09:03,830
‫ein wahnsinnig komplexes Thema.

197
00:09:03,830 --> 00:09:06,470
‫Aber in diesem Abschnitt lernen Sie die Grundlagen,

198
00:09:06,470 --> 00:09:08,830
‫die Sie wissen müssen, um wirklich mit

199
00:09:08,830 --> 00:09:10,943
‫der Erstellung erstaunlicher Anwendungen zu beginnen.

