Would you like to inspect the original subtitles? These are the user uploaded subtitles that are being translated:
1
00:00:01,070 --> 00:00:01,950
All right!
2
00:00:01,950 --> 00:00:04,040
And now to finish this section,
3
00:00:04,040 --> 00:00:07,043
let's learn how to catch uncaught exceptions.
4
00:00:08,660 --> 00:00:11,930
But what exactly are uncaught exceptions?
5
00:00:11,930 --> 00:00:15,290
Well, all errors, or let's also call them bugs,
6
00:00:15,290 --> 00:00:17,280
that occur in our synchronous code
7
00:00:17,280 --> 00:00:21,230
but are not handled anywhere are called uncaught exceptions.
8
00:00:21,230 --> 00:00:25,340
And like before, so just like with the unhandled rejections,
9
00:00:25,340 --> 00:00:28,730
we also have a way of handling uncaught exceptions.
10
00:00:28,730 --> 00:00:30,720
So let me quickly show you
11
00:00:30,720 --> 00:00:32,823
an example of an uncaught exception.
12
00:00:34,370 --> 00:00:37,400
So let's simply pretend that we're trying
13
00:00:37,400 --> 00:00:40,423
to console.log something that doesn't exist.
14
00:00:42,110 --> 00:00:46,600
And so right away, we get this error here, x is not defined,
15
00:00:46,600 --> 00:00:50,080
and then by default, we get this entire stack trace here
16
00:00:50,080 --> 00:00:51,960
printed to the console.
17
00:00:51,960 --> 00:00:52,793
All right.
18
00:00:52,793 --> 00:00:57,660
And now, to fix this, this is very similar to doing
19
00:00:57,660 --> 00:00:59,380
the unhandled rejections.
20
00:00:59,380 --> 00:01:02,040
So again, we're listening to an event,
21
00:01:02,040 --> 00:01:04,040
this time it's called uncaughtException.
22
00:01:08,662 --> 00:01:11,912
And of course it needs to be in quotes.
23
00:01:12,840 --> 00:01:17,390
And then just like before, we pass in our callback function.
24
00:01:17,390 --> 00:01:18,223
Okay.
25
00:01:18,223 --> 00:01:20,960
And now actually what we're doing here is very similar
26
00:01:20,960 --> 00:01:22,350
to what we did here.
27
00:01:22,350 --> 00:01:24,970
So we wanna lock the error to the console
28
00:01:24,970 --> 00:01:29,690
so that it then shows up in the logs in our server, okay?
29
00:01:29,690 --> 00:01:32,430
So, giving us a way of then fixing the problem.
30
00:01:32,430 --> 00:01:35,223
And then we want to gracefully shut down the server.
31
00:01:36,750 --> 00:01:39,010
So let's, well actually here I want
32
00:01:39,010 --> 00:01:41,590
to print the entire error to the console,
33
00:01:41,590 --> 00:01:43,940
and not just the message, okay?
34
00:01:43,940 --> 00:01:45,993
And let's also change the order here,
35
00:01:47,300 --> 00:01:48,660
but that's it.
36
00:01:48,660 --> 00:01:50,140
So the rest is the same.
37
00:01:50,140 --> 00:01:51,290
And here it's of course
38
00:01:53,310 --> 00:01:58,310
UNCAUGHT EXCEPTION!
39
00:01:58,320 --> 00:02:01,810
Now I could refactor this here into a nice function,
40
00:02:01,810 --> 00:02:05,020
but let's just keep it like this, all right?
41
00:02:05,020 --> 00:02:07,123
Okay, so let's now rerun this.
42
00:02:08,330 --> 00:02:11,090
And so let's take a look at what we have here.
43
00:02:11,090 --> 00:02:13,700
And indeed, we now see UNCAUGHT EXCEPTION!
44
00:02:13,700 --> 00:02:14,780
Shutting down.
45
00:02:14,780 --> 00:02:15,750
All right?
46
00:02:15,750 --> 00:02:18,770
And actually this again prints the entire stack
47
00:02:18,770 --> 00:02:21,400
to the console, but I don't really want that.
48
00:02:21,400 --> 00:02:22,660
I don't like that.
49
00:02:22,660 --> 00:02:25,860
So let's just actually go back to what we had here.
50
00:02:25,860 --> 00:02:28,683
So err.name and then err.message.
51
00:02:30,890 --> 00:02:32,610
Okay, and so now we have the ReferenceError
52
00:02:32,610 --> 00:02:36,290
that x is not defined, okay?
53
00:02:36,290 --> 00:02:38,520
And let's just put the same here.
54
00:02:38,520 --> 00:02:39,983
So just like it was before.
55
00:02:40,950 --> 00:02:41,783
All right.
56
00:02:41,783 --> 00:02:43,070
And that's actually all there is
57
00:02:43,070 --> 00:02:45,370
to catching uncaught exceptions.
58
00:02:45,370 --> 00:02:48,180
Now while here in the unhandled rejection,
59
00:02:48,180 --> 00:02:51,230
crashing the application like we did here is optional,
60
00:02:51,230 --> 00:02:53,630
when there is an uncaught exception,
61
00:02:53,630 --> 00:02:57,150
we really, really need to crash our application
62
00:02:57,150 --> 00:02:59,970
because after there was an uncaught exception,
63
00:02:59,970 --> 00:03:01,610
the entire node process is
64
00:03:01,610 --> 00:03:04,370
in a so-called unclean state, all right?
65
00:03:04,370 --> 00:03:07,770
And so to fix that, the process need to terminate
66
00:03:07,770 --> 00:03:09,940
and then to be restarted, all right?
67
00:03:09,940 --> 00:03:11,330
And again, in production,
68
00:03:11,330 --> 00:03:13,460
we should then have a tool in place
69
00:03:13,460 --> 00:03:16,640
which will restart the application after crashing.
70
00:03:16,640 --> 00:03:19,270
And many hosting services already do that
71
00:03:19,270 --> 00:03:20,860
out of the box, all right?
72
00:03:20,860 --> 00:03:23,170
So, completely automatically without
73
00:03:23,170 --> 00:03:24,980
us having to do anything.
74
00:03:24,980 --> 00:03:27,820
Now, in Node.js, it's not really a good practice
75
00:03:27,820 --> 00:03:31,580
to just blindly rely on these two error handlers
76
00:03:31,580 --> 00:03:34,170
that we just implemented here, okay?
77
00:03:34,170 --> 00:03:36,470
So ideally errors should really be handled
78
00:03:36,470 --> 00:03:38,120
right where they occur.
79
00:03:38,120 --> 00:03:42,150
So for example, in the problem connecting to the database,
80
00:03:42,150 --> 00:03:44,660
we should of course add a catch handler there
81
00:03:44,660 --> 00:03:46,480
and not just simply rely on the
82
00:03:46,480 --> 00:03:50,160
unhandled rejection callback that we have here, okay?
83
00:03:50,160 --> 00:03:53,600
And some people even say that we shouldn't use these at all,
84
00:03:53,600 --> 00:03:54,770
but I disagree with that.
85
00:03:54,770 --> 00:03:58,090
I think that as a safety net, let's say,
86
00:03:58,090 --> 00:04:02,470
they can be very useful and play a part in our application.
87
00:04:02,470 --> 00:04:04,020
Now actually this handler here
88
00:04:04,020 --> 00:04:07,300
should be at the very top of our code, okay?
89
00:04:07,300 --> 00:04:11,280
Or at least before any other code is really executed.
90
00:04:11,280 --> 00:04:14,980
Because watch what happens if I move this line of code here
91
00:04:14,980 --> 00:04:16,512
before this handler.
92
00:04:17,350 --> 00:04:19,593
So if I put it here, for example,
93
00:04:21,140 --> 00:04:23,070
and then give it a save,
94
00:04:23,070 --> 00:04:24,680
then you actually see that our handler
95
00:04:24,680 --> 00:04:29,410
does not catch this exception, so this error here, right?
96
00:04:29,410 --> 00:04:31,830
And so that's because only here at the end
97
00:04:31,830 --> 00:04:35,010
we actually start listening for an uncaught exception.
98
00:04:35,010 --> 00:04:37,580
But in this case here, the uncaught exception
99
00:04:37,580 --> 00:04:40,380
happens before we even listen to that event.
100
00:04:40,380 --> 00:04:44,630
And so therefore, we have no way of catching it, right?
101
00:04:44,630 --> 00:04:48,920
And so we should ideally put it here, right at the top,
102
00:04:48,920 --> 00:04:51,030
again before any other code executes.
103
00:04:51,030 --> 00:04:53,423
Especially the one in our application.
104
00:04:54,580 --> 00:04:57,760
So let's put it actually right here.
105
00:04:57,760 --> 00:04:59,550
Now the problem here will be
106
00:04:59,550 --> 00:05:02,820
that the server is not defined at this point.
107
00:05:02,820 --> 00:05:04,160
But that's not a problem,
108
00:05:04,160 --> 00:05:06,180
because actually we don't need the server here
109
00:05:06,180 --> 00:05:08,060
at all, all right?
110
00:05:08,060 --> 00:05:09,480
And that's because these errors,
111
00:05:09,480 --> 00:05:11,270
so these uncaught exceptions,
112
00:05:11,270 --> 00:05:13,670
they are not gonna happen asynchronously.
113
00:05:13,670 --> 00:05:15,630
So they are not gonna have anything to do
114
00:05:15,630 --> 00:05:17,660
with the server actually.
115
00:05:17,660 --> 00:05:19,360
So we don't need this here at all.
116
00:05:20,470 --> 00:05:22,250
We can just save it here,
117
00:05:22,250 --> 00:05:25,480
and so now we have it before we actually require
118
00:05:25,480 --> 00:05:26,890
our main application.
119
00:05:26,890 --> 00:05:28,663
And so if we now have an error,
120
00:05:29,940 --> 00:05:31,850
let's try it first here,
121
00:05:31,850 --> 00:05:33,500
so you see that now we're back
122
00:05:33,500 --> 00:05:36,710
to actually catching it in our error handler.
123
00:05:36,710 --> 00:05:41,333
But if we now had this code, for example inside of app.js,
124
00:05:42,350 --> 00:05:45,810
let's say, it doesn't really matter,
125
00:05:45,810 --> 00:05:47,410
let's just say it's here,
126
00:05:47,410 --> 00:05:50,260
and if we now run this, well then you see
127
00:05:50,260 --> 00:05:52,530
that we're still catching that exception
128
00:05:52,530 --> 00:05:56,290
in our error handler, which before would not be the case.
129
00:05:56,290 --> 00:05:57,180
All right?
130
00:05:57,180 --> 00:05:59,590
And now just for an experiment,
131
00:05:59,590 --> 00:06:03,120
what do you think if we put this code
132
00:06:03,120 --> 00:06:06,100
right here in this middleware function?
133
00:06:06,100 --> 00:06:07,690
What do you think is gonna happen
134
00:06:07,690 --> 00:06:09,510
when we save this file now?
135
00:06:09,510 --> 00:06:12,200
So x is still not defined anywhere,
136
00:06:12,200 --> 00:06:13,840
but let's take a look at what happens
137
00:06:13,840 --> 00:06:15,373
when we now run this code.
138
00:06:16,980 --> 00:06:19,510
And so now we actually have no error.
139
00:06:19,510 --> 00:06:21,300
Or actually we do, but that's only
140
00:06:21,300 --> 00:06:24,130
because of our unhandled rejection,
141
00:06:24,130 --> 00:06:26,020
which is due to the fact
142
00:06:26,020 --> 00:06:27,920
that our password here is still wrong.
143
00:06:29,290 --> 00:06:32,170
So if we save that and now save it again,
144
00:06:32,170 --> 00:06:34,560
you should see no error at all.
145
00:06:34,560 --> 00:06:35,730
And indeed, we don't.
146
00:06:35,730 --> 00:06:36,953
And why is that?
147
00:06:37,830 --> 00:06:40,940
Well, it's because this middleware function here of course
148
00:06:40,940 --> 00:06:42,450
is only called as soon
149
00:06:42,450 --> 00:06:45,220
as there actually is a request, right?
150
00:06:45,220 --> 00:06:48,113
And so let's see what happens when we do a request.
151
00:06:50,760 --> 00:06:54,180
And so let's do a Get All Tours request.
152
00:06:54,180 --> 00:06:55,720
And let's wait for it.
153
00:06:55,720 --> 00:06:58,980
And, here we get a "Something went very wrong!"
154
00:06:58,980 --> 00:07:01,420
error message with the 500,
155
00:07:01,420 --> 00:07:03,560
and that's also because we are still
156
00:07:03,560 --> 00:07:05,820
in production mode, okay?
157
00:07:05,820 --> 00:07:08,990
But anyway, getting this message here, remember,
158
00:07:08,990 --> 00:07:12,120
means that we have a nonoperational error here.
159
00:07:12,120 --> 00:07:15,630
So basically an error that we did not create ourselves.
160
00:07:15,630 --> 00:07:19,580
And so, right this, we now enter here
161
00:07:19,580 --> 00:07:24,380
in our errorController, we go right here, right?
162
00:07:24,380 --> 00:07:28,780
So into this else branch here in the sendErrorProd function.
163
00:07:28,780 --> 00:07:30,380
And actually you see the error
164
00:07:30,380 --> 00:07:32,970
down here in the console as well, okay?
165
00:07:32,970 --> 00:07:35,600
And so that's what happens when there is an error
166
00:07:35,600 --> 00:07:39,430
inside of any Express middleware, right?
167
00:07:39,430 --> 00:07:41,370
So Express, when there is an error,
168
00:07:41,370 --> 00:07:44,480
will automatically go to the error-handling middleware
169
00:07:44,480 --> 00:07:46,330
with that error, okay?
170
00:07:46,330 --> 00:07:48,100
And so that's why when we get an error
171
00:07:48,100 --> 00:07:50,410
here in any of our middleware function,
172
00:07:50,410 --> 00:07:55,240
it will immediately go here into this handler, okay?
173
00:07:55,240 --> 00:07:56,520
And since we're in production,
174
00:07:56,520 --> 00:07:58,730
it will enter this block here,
175
00:07:58,730 --> 00:08:00,994
but since it's not a CastError,
176
00:08:00,994 --> 00:08:03,700
and not this error, and not a ValidationError,
177
00:08:03,700 --> 00:08:06,830
then as soon as the error is actually sent,
178
00:08:06,830 --> 00:08:09,640
right here, we then enter this block.
179
00:08:09,640 --> 00:08:14,640
And again, that's why we send this generic error, all right?
180
00:08:15,235 --> 00:08:17,500
Let's now actually exit this mode here
181
00:08:17,500 --> 00:08:20,053
and go back to our normal npm start.
182
00:08:22,310 --> 00:08:26,130
And so right now, our error will be sent like this, right?
183
00:08:26,130 --> 00:08:29,440
So send development error will give us all the details
184
00:08:29,440 --> 00:08:31,773
about the error that is happening.
185
00:08:33,610 --> 00:08:38,490
And so now indeed we get ReferenceError: x is not defined.
186
00:08:38,490 --> 00:08:39,323
Okay?
187
00:08:39,323 --> 00:08:41,533
So in app.js, line 21.
188
00:08:42,480 --> 00:08:46,300
And so, line 21 is where it is,
189
00:08:46,300 --> 00:08:47,520
but let's get rid of it.
190
00:08:47,520 --> 00:08:49,760
I just wanted to show it to you.
191
00:08:49,760 --> 00:08:51,350
Okay?
192
00:08:51,350 --> 00:08:53,770
Anyway, with this, we actually close
193
00:08:53,770 --> 00:08:55,620
our error handling section.
194
00:08:55,620 --> 00:08:58,830
And there could be an entire course on error handling
195
00:08:58,830 --> 00:09:01,940
with Node and Express, because it really is
196
00:09:01,940 --> 00:09:03,830
an insanely complex topic.
197
00:09:03,830 --> 00:09:06,470
But, in this section, you learn the essentials
198
00:09:06,470 --> 00:09:08,830
that you need to know in order to really get started
199
00:09:08,830 --> 00:09:10,943
building amazing applications.
15306
Can't find what you're looking for?
Get subtitles in any language from opensubtitles.com, and translate them here.