All language subtitles for 014 Catching Uncaught Exceptions_Downloadly.ir_en

af Afrikaans
sq Albanian
am Amharic
ar Arabic
hy Armenian
az Azerbaijani
eu Basque
be Belarusian
bn Bengali
bs Bosnian
bg Bulgarian
ca Catalan
ceb Cebuano
ny Chichewa
zh-CN Chinese (Simplified)
zh-TW Chinese (Traditional)
co Corsican
hr Croatian
cs Czech
da Danish
nl Dutch
en English
eo Esperanto
et Estonian
tl Filipino
fi Finnish
fr French
fy Frisian
gl Galician
ka Georgian
de German
el Greek
gu Gujarati
ht Haitian Creole
ha Hausa
haw Hawaiian
iw Hebrew
hi Hindi
hmn Hmong
hu Hungarian
is Icelandic
ig Igbo
id Indonesian
ga Irish
it Italian
ja Japanese
jw Javanese
kn Kannada
kk Kazakh
km Khmer
ko Korean
ku Kurdish (Kurmanji)
ky Kyrgyz
lo Lao
la Latin
lv Latvian
lt Lithuanian
lb Luxembourgish
mk Macedonian
mg Malagasy
ms Malay
ml Malayalam
mt Maltese
mi Maori
mr Marathi
mn Mongolian
my Myanmar (Burmese)
ne Nepali
no Norwegian
ps Pashto
fa Persian Download
pl Polish
pt Portuguese
pa Punjabi
ro Romanian
ru Russian
sm Samoan
gd Scots Gaelic
sr Serbian
st Sesotho
sn Shona
sd Sindhi
si Sinhala
sk Slovak
sl Slovenian
so Somali
es Spanish
su Sundanese
sw Swahili
sv Swedish
tg Tajik
ta Tamil
te Telugu
th Thai
tr Turkish
uk Ukrainian
ur Urdu
uz Uzbek
vi Vietnamese
cy Welsh
xh Xhosa
yi Yiddish
yo Yoruba
zu Zulu
or Odia (Oriya)
rw Kinyarwanda
tk Turkmen
tt Tatar
ug Uyghur
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.