00:00.170 --> 00:00.920
خوش برگشتید.

00:00.920 --> 00:08.090
در این ویدئو می‌خواهیم به 'try and catch' نگاه کنیم؛ کلمات کلیدی بسیار قدرتمندی که به ما اجازه می‌دهند exceptionها رو بگیریم (catch کنیم)،

00:08.090 --> 00:15.140
که به نوبه‌ی خود به ما این امکان رو می‌دن که مطمئن بشیم خطایی که معمولاً باعث کرش کردن (crash) اپلیکیشن‌مون می‌شه، ناگهان

00:15.140 --> 00:21.980
اپلیکیشن‌مون رو کرش نکنه و بتونه طبق انتظار کار کنه، یا حداقل بتونه بخش‌های

00:21.980 --> 00:23.270
دیگه رو طبق انتظار اجرا کنه.

00:23.270 --> 00:26.420
خب، چه مثالی می‌تونه واقعاً نشون بده که این موضوع چقدر مهمه؟

00:26.420 --> 00:32.570
مثلاً فرض کنید دارید یک فایل دانلود می‌کنید یا داده‌ای رو توی دیتابیس (database) ذخیره می‌کنید یا همچین چیزی،

00:32.570 --> 00:38.030
و ناگهان اتصال قطع می‌شه. اون‌وقت شما نمی‌خواین اپلیکیشن‌تون کرش کنه.

00:38.030 --> 00:45.530
و برای اینکه این اتفاق نیفته و کرش نکنه، باید اون کدی رو که ممکنه باعث کرش بشه، داخلِ

00:45.530 --> 04:46.460
یک 'try and catch' قرار بدین.

00:46.460 --> 00:53.840
پس باید مطمئن بشید که اگه مشکلی پیش اومد، اپلیکیشن شما اون مشکل رو به درستی هندل (handle) کنه.

00:53.840 --> 01:00.140
حالا بیایید ببینیم چطور می‌تونیم این ارورها (errors) رو به درستی هندل کنیم تا اپلیکیشن‌مون کرش نکنه

01:00.140 --> 01:01.490
با یک مثال خیلی ساده.

01:01.490 --> 01:06.860
پس فعلاً قرار نیست از دیتابیس یا یک وب‌سایت داده دانلود کنیم یا همچین چیزی.

01:06.860 --> 01:12.770
کاری که می‌خوایم بکنیم اینه که فقط همین مثال خیلی ساده رو اینجا داشته باشیم که می‌گیم:

01:12.770 --> 01:14.180
int result برابر با صفر.

01:14.180 --> 01:15.380
پس این integer رو داریم.

01:15.380 --> 01:21.260
بعدش به کاربر اطلاع می‌دیم که باید یک عدد وارد کنه، هرچند فعلاً فقط می‌خواهیم

01:21.260 --> 01:22.790
یک عدد خیلی ساده اینجا استفاده کنیم.

01:22.790 --> 01:25.070
پس int num one قراره صفر باشه.

01:25.070 --> 01:27.020
و num two قراره دو باشه.

01:27.020 --> 01:30.920
و می‌گیم result باید num two تقسیم بر num one باشه.

01:30.920 --> 01:36.860
حالا احتمالاً شما همین الانش هم یک مشکل اینجا می‌بینید، چون کاری که داریم می‌کنیم اینه که داریم بر صفر تقسیم می‌کنیم.

01:36.860 --> 1:40.640
و وقتی بر صفر تقسیم می‌کنید، دارید باعث یک ارور می‌شید.

01:40.640 --> 01:43.430
بعدش این Console.WriteLine رو داریم که result رو نمایش بده.

01:43.430 --> 01:46.460
و این ReadKey رو داریم که اپلیکیشن‌مون رو در حال اجرا نگه داره.

01:46.460 --> 01:49.400
پس بیایید این کد رو اجرا کنیم و چیزی رو که درباره‌اش حرف می‌زدم، خواهید دید.

01:49.400 --> 01:55.130
پس ما به این exception (استثنا) هندل نشده‌ای که باهاش مواجه شدیم، برخورد کردیم.

01:55.130 --> 01:57.710
می‌گه system divide by zero.

01:57.710 --> 02:01.010
Exception: attempted to divide by zero.

02:01.160 --> 02:03.890
و این چیزی نیست که خوب باشه.

02:03.890 --> 02:05.690
پس اپلیکیشن‌مون کرش کرد.

02:05.690 --> 02:09.020
و اگه به اپلیکیشن‌مون نگاه کنیم، می‌گه لطفا یک عدد وارد کنید.

02:09.020 --> 02:11.600
ولی result (نتیجه) رو نمایش نداد.

02:11.600 --> 02:18.110
پس حتی به خط ۱۶ نرسید، جایی که قرار بود result رو نمایش بده.

02:18.110 --> 02:22.010
پس اینجاست که ما در خط ۱۳ ارور رو دریافت کردیم.

02:22.010 --> 02:24.860
و اپلیکیشن‌مون در همین نقطه کرش می‌کنه.

02:24.860 --> 02:27.020
پس چطور می‌تونیم از این جلوگیری کنیم؟

02:27.020 --> 02:28.940
چطور می‌تونیم از کرش کردنش جلوگیری کنیم؟

02:28.940 --> 02:34.190
خب، واضحاً اولین کار اینه که اصلاً مشکل رو به وجود نیاریم، یعنی بر صفر تقسیم نکنیم.

02:34.190 --> 02:38.690
اما راه دیگه برای حلش استفاده از 'try and catch' هستش.

02:38.690 --> 02:40.850
پس بذارین بهتون نشون بدم 'try and catch' چطور کار می‌کنه.

02:40.850 --> 02:44.750
پس شما این کلمه کلیدی 'try' رو دارید و بعد این کلمه کلیدی 'catch' رو.

02:44.750 --> 02:46.520
و بعد از یک 'exception' استفاده می‌کنید.

02:46.520 --> 02:52.010
و در این حالت من از x.ToString استفاده می‌کنم، خب.

02:52.010 --> 02:54.320
من فقط می‌خوام 'exception' رو نمایش بدم.

02:54.320 --> 02:59.480
پس می‌خوام 'exception' رو به یک string تبدیل کنم که بعدش بهمون اجازه می‌ده نمایشش بدیم.

02:59.480 --> 03:03.950
و بذارین در واقع با استفاده از Console.WriteLine اینجوری نمایشش بدم.

03:03.950 --> 03:07.670
پس حالا بیایید تمام این کدی رو که ممکنه مشکل‌ساز بشه،

03:07.670 --> 03:09.470
داخل این 'try block' قرار بدیم.

03:09.470 --> 03:11.750
پس دیگه خارج از 'try block' نیست.

03:11.750 --> 03:13.460
داخل 'try block' هست.

03:13.460 --> 03:15.200
پس الان اینجا چه خبره؟

03:15.200 --> 03:20.960
خب ما این 'try block' رو داریم که بهمون اجازه می‌ده کدمون رو که ممکنه پتانسیل مشکل‌ساز شدن داشته باشه، اجرا کنیم.

03:20.960 --> 03:24.980
بعدش این کلمه کلیدی 'catch' رو داریم که در اونجا 'exception' رو هم دریافت می‌کنیم.

03:24.980 --> 03:26.990
پس از این کلمه کلیدی 'exception' استفاده می‌کنیم.

03:26.990 --> 03:28.460
بعدش بهش اسم می‌دیم.

03:28.460 --> 03:31.850
تا بتونیم از این 'exception' داخل 'catch block' استفاده کنیم.

03:31.850 --> 03:34.040
حالا داخل این آکولادها (curly brackets).

03:34.040 --> 03:36.590
پس حالا می‌گه Console.WriteLine.

03:36.590 --> 03:40.700
و بعد هر 'exception' که اتفاق افتاد، اون رو به صورت یک string نمایش بده.

03:40.700 --> 03:43.910
پس بیایید این کد رو دوباره اجرا کنیم و ببینیم چه اتفاقی می‌افته.

03:43.910 --> 03:46.370
پس می‌بینیم که می‌گه: 'لطفا یک عدد وارد کنید'.

03:46.370 --> 03:50.240
خب ما هنوز عددی وارد نکردیم ولی می‌گه system divide by zero.

03:50.240 --> 03:52.820
Exception: attempted to divide by zero.

03:52.820 --> 03:54.260
و بعد می‌گه که کجاست.

03:54.260 --> 03:56.540
Try catch exception program main.

03:56.540 --> 03:59.630
پس اون اسم 'exception' هستش، درست روی PC من.

03:59.630 --> 04:03.290
و در این فایل Program.cs در خط ۱۵.

04:03.290 --> 04:04.820
اونجا جاییه که ارور اتفاق افتاده.

04:04.820 --> 04:09.650
اما چیزی که واقعاً جالبه اینه که می‌بینید 'result zero' (نتیجه‌ی صفر) همچنان نمایش داده می‌شه.

04:09.650 --> 04:16.580
پس حتی با اینکه این ارور رخ داد و ما داریم ارور رو نمایش می‌دیم، کدمون همچنان به کارش ادامه داد.

04:16.580 --> 04:19.130
پس می‌تونید ببینید که هیچ کرش کردنی، هیچ چیزی اتفاق نمی‌افته.

04:19.130 --> 04:21.020
اپلیکیشن‌مون طبق انتظار کار می‌کنه.

04:21.020 --> 04:24.110
خب چطور می‌تونیم این رو بهتر کنیم؟

04:24.380 --> 04:31.190
خب، اول از همه، به جای نمایش کل 'exception'، می‌تونستیم فقط یک پیام مشخص رو نمایش بدیم.

04:31.190 --> 04:34.340
پس پیام چیزیه که توسط کاربر قابل خوندنه.

04:34.340 --> 04:37.130
پس اینجا اینه: attempted to divide by zero.

04:37.130 --> 04:39.740
این خیلی بیشتر از اون چیزی که قبلاً داشتیم، قابل خوندنه.

04:39.740 --> 04:41.840
حتی می‌تونستیم اطلاعات بیشتری هم بدیم.

04:41.840 --> 04:47.510
می‌تونستیم چیزی شبیه 'Error: ' (ارور، دو نقطه) و بعدش پیام رو بگیم.

04:47.510 --> 04:50.090
پس حالا می‌دونیم که به یک ارور برخورد کردیم.

04:50.090 --> 04:52.160
می‌گه: 'Error: attempted to divide by zero'.

04:52.160 --> 04:56.210
پس این مثالی بود که در اون تقسیم بر صفر رو اجبار کردیم.

04:56.210 --> 04:59.720
حالا فرض کنید به جای اجبار و تقسیم بر.

05:00.120 --> 05:04.440
پس ما فقط داریم سعی می‌کنیم هر چیزی رو که کاربر توی console وارد کرده، parse کنیم.

05:04.440 --> 05:08.040
پس بذارین دوباره اجراش کنم و می‌گه: 'لطفا یک عدد وارد کنید'.

05:08.040 --> 05:10.110
بذارین پنج رو وارد کنم.

05:10.110 --> 05:11.310
همه چیز کار می‌کنه.

05:11.310 --> 05:13.050
حالا بذارین دوباره این رو اجرا کنم.

05:13.050 --> 05:14.580
بذارین صفر رو وارد کنم.

05:14.580 --> 05:17.160
و می‌بینید: 'attempted to divide by zero'.

05:17.160 --> 05:21.000
و بعد بذارین دوباره اجراش کنم و F رو وارد کنم.

05:21.000 --> 05:22.140
و می‌بینید ارور.

05:22.140 --> 05:25.110
می‌گه: 'The input string f was not in a correct format'.

05:25.110 --> 05:31.980
پس این ارور هم البته عالی نیست، ولی حداقل به کاربر یک ایده‌ای می‌ده که چه خبره

05:31.980 --> 05:32.940
تقریباً.

05:32.940 --> 05:37.530
و در جزئیاتی که بهتون می‌ده، اغراق نمی‌کنه.

05:37.530 --> 05:41.880
با این حال، اپلیکیشن‌مون به کارش ادامه داد و نتیجه همچنان نمایش داده شد.

05:41.880 --> 05:46.320
پس این فقط یک مثال بود از کاری که 'try and catch' می‌تونه انجام بده.

05:46.320 --> 05:47.970
و ما از این 'exception' استفاده می‌کنیم.

05:47.970 --> 05:50.820
یا داریم این 'exception' به اسم X رو دریافت می‌کنیم.

05:50.820 --> 05:57.300
و می‌تونیم از جزئیاتش استفاده کنیم تا نمایش بدیم 'exception' یا ارور در مورد چی بود.

05:57.300 --> 06:05.610
پس اگه اینجا از X استفاده کنید، می‌بینید که چند تا 'method' (متد) موجود هستن، اما چند تا 'property' (پراپرتی) هم هستن.

06:05.610 --> 06:06.240
پراپرتی.

06:06.240 --> 06:08.160
پس 'message' (پیام) یکی از اوناست که ما استفاده کردیم.

06:08.160 --> 06:12.510
اگه بخواین اطلاعات بیشتری به دست بیارید، می‌تونید 'stack trace' رو هم بگیرید.

06:12.510 --> 06:15.840
و بله، اینا به نظرم مفیدترین‌ها هستن.

06:15.840 --> 06:20.670
پس این اولین نگاه ما به 'try and catch' بود.

06:20.670 --> 06:24.600
پس در ویدئوی بعدی، عمیق‌تر واردش می‌شیم.

06:24.600 --> 06:30.810
ما هنوز یک کلمه کلیدی دیگه در این زمینه‌ی 'try and catch' داریم که اسمش 'finally' هستش.

06:30.810 --> 06:32.310
پس شما رو در ویدئوی بعدی می‌بینم.