خوش برگشتید.
در این ویدئو می‌خواهیم به 'try and catch' نگاه کنیم؛ کلمات کلیدی بسیار قدرتمندی که به ما اجازه می‌دهند exceptionها رو بگیریم (catch کنیم)،
که به نوبه‌ی خود به ما این امکان رو می‌دن که مطمئن بشیم خطایی که معمولاً باعث کرش کردن (crash) اپلیکیشن‌مون می‌شه، ناگهان
اپلیکیشن‌مون رو کرش نکنه و بتونه طبق انتظار کار کنه، یا حداقل بتونه بخش‌های
دیگه رو طبق انتظار اجرا کنه.
خب، چه مثالی می‌تونه واقعاً نشون بده که این موضوع چقدر مهمه؟
مثلاً فرض کنید دارید یک فایل دانلود می‌کنید یا داده‌ای رو توی دیتابیس (database) ذخیره می‌کنید یا همچین چیزی،
و ناگهان اتصال قطع می‌شه. اون‌وقت شما نمی‌خواین اپلیکیشن‌تون کرش کنه.
و برای اینکه این اتفاق نیفته و کرش نکنه، باید اون کدی رو که ممکنه باعث کرش بشه، داخلِ
یک 'try and catch' قرار بدین.
پس باید مطمئن بشید که اگه مشکلی پیش اومد، اپلیکیشن شما اون مشکل رو به درستی هندل (handle) کنه.
حالا بیایید ببینیم چطور می‌تونیم این ارورها (errors) رو به درستی هندل کنیم تا اپلیکیشن‌مون کرش نکنه
با یک مثال خیلی ساده.
پس فعلاً قرار نیست از دیتابیس یا یک وب‌سایت داده دانلود کنیم یا همچین چیزی.
کاری که می‌خوایم بکنیم اینه که فقط همین مثال خیلی ساده رو اینجا داشته باشیم که می‌گیم:
int result برابر با صفر.
پس این integer رو داریم.
بعدش به کاربر اطلاع می‌دیم که باید یک عدد وارد کنه، هرچند فعلاً فقط می‌خواهیم
یک عدد خیلی ساده اینجا استفاده کنیم.
پس int num one قراره صفر باشه.
و num two قراره دو باشه.
و می‌گیم result باید num two تقسیم بر num one باشه.
حالا احتمالاً شما همین الانش هم یک مشکل اینجا می‌بینید، چون کاری که داریم می‌کنیم اینه که داریم بر صفر تقسیم می‌کنیم.
و وقتی بر صفر تقسیم می‌کنید، دارید باعث یک ارور می‌شید.
بعدش این Console.WriteLine رو داریم که result رو نمایش بده.
و این ReadKey رو داریم که اپلیکیشن‌مون رو در حال اجرا نگه داره.
پس بیایید این کد رو اجرا کنیم و چیزی رو که درباره‌اش حرف می‌زدم، خواهید دید.
پس ما به این exception (استثنا) هندل نشده‌ای که باهاش مواجه شدیم، برخورد کردیم.
می‌گه system divide by zero.
Exception: attempted to divide by zero.
و این چیزی نیست که خوب باشه.
پس اپلیکیشن‌مون کرش کرد.
و اگه به اپلیکیشن‌مون نگاه کنیم، می‌گه لطفا یک عدد وارد کنید.
ولی result (نتیجه) رو نمایش نداد.
پس حتی به خط ۱۶ نرسید، جایی که قرار بود result رو نمایش بده.
پس اینجاست که ما در خط ۱۳ ارور رو دریافت کردیم.
و اپلیکیشن‌مون در همین نقطه کرش می‌کنه.
پس چطور می‌تونیم از این جلوگیری کنیم؟
چطور می‌تونیم از کرش کردنش جلوگیری کنیم؟
خب، واضحاً اولین کار اینه که اصلاً مشکل رو به وجود نیاریم، یعنی بر صفر تقسیم نکنیم.
اما راه دیگه برای حلش استفاده از 'try and catch' هستش.
پس بذارین بهتون نشون بدم 'try and catch' چطور کار می‌کنه.
پس شما این کلمه کلیدی 'try' رو دارید و بعد این کلمه کلیدی 'catch' رو.
و بعد از یک 'exception' استفاده می‌کنید.
و در این حالت من از x.ToString استفاده می‌کنم، خب.
من فقط می‌خوام 'exception' رو نمایش بدم.
پس می‌خوام 'exception' رو به یک string تبدیل کنم که بعدش بهمون اجازه می‌ده نمایشش بدیم.
و بذارین در واقع با استفاده از Console.WriteLine اینجوری نمایشش بدم.
پس حالا بیایید تمام این کدی رو که ممکنه مشکل‌ساز بشه،
داخل این 'try block' قرار بدیم.
پس دیگه خارج از 'try block' نیست.
داخل 'try block' هست.
پس الان اینجا چه خبره؟
خب ما این 'try block' رو داریم که بهمون اجازه می‌ده کدمون رو که ممکنه پتانسیل مشکل‌ساز شدن داشته باشه، اجرا کنیم.
بعدش این کلمه کلیدی 'catch' رو داریم که در اونجا 'exception' رو هم دریافت می‌کنیم.
پس از این کلمه کلیدی 'exception' استفاده می‌کنیم.
بعدش بهش اسم می‌دیم.
تا بتونیم از این 'exception' داخل 'catch block' استفاده کنیم.
حالا داخل این آکولادها (curly brackets).
پس حالا می‌گه Console.WriteLine.
و بعد هر 'exception' که اتفاق افتاد، اون رو به صورت یک string نمایش بده.
پس بیایید این کد رو دوباره اجرا کنیم و ببینیم چه اتفاقی می‌افته.
پس می‌بینیم که می‌گه: 'لطفا یک عدد وارد کنید'.
خب ما هنوز عددی وارد نکردیم ولی می‌گه system divide by zero.
Exception: attempted to divide by zero.
و بعد می‌گه که کجاست.
Try catch exception program main.
پس اون اسم 'exception' هستش، درست روی PC من.
و در این فایل Program.cs در خط ۱۵.
اونجا جاییه که ارور اتفاق افتاده.
اما چیزی که واقعاً جالبه اینه که می‌بینید 'result zero' (نتیجه‌ی صفر) همچنان نمایش داده می‌شه.
پس حتی با اینکه این ارور رخ داد و ما داریم ارور رو نمایش می‌دیم، کدمون همچنان به کارش ادامه داد.
پس می‌تونید ببینید که هیچ کرش کردنی، هیچ چیزی اتفاق نمی‌افته.
اپلیکیشن‌مون طبق انتظار کار می‌کنه.
خب چطور می‌تونیم این رو بهتر کنیم؟
خب، اول از همه، به جای نمایش کل 'exception'، می‌تونستیم فقط یک پیام مشخص رو نمایش بدیم.
پس پیام چیزیه که توسط کاربر قابل خوندنه.
پس اینجا اینه: attempted to divide by zero.
این خیلی بیشتر از اون چیزی که قبلاً داشتیم، قابل خوندنه.
حتی می‌تونستیم اطلاعات بیشتری هم بدیم.
می‌تونستیم چیزی شبیه 'Error: ' (ارور، دو نقطه) و بعدش پیام رو بگیم.
پس حالا می‌دونیم که به یک ارور برخورد کردیم.
می‌گه: 'Error: attempted to divide by zero'.
پس این مثالی بود که در اون تقسیم بر صفر رو اجبار کردیم.
حالا فرض کنید به جای اجبار و تقسیم بر.
پس ما فقط داریم سعی می‌کنیم هر چیزی رو که کاربر توی console وارد کرده، parse کنیم.
پس بذارین دوباره اجراش کنم و می‌گه: 'لطفا یک عدد وارد کنید'.
بذارین پنج رو وارد کنم.
همه چیز کار می‌کنه.
حالا بذارین دوباره این رو اجرا کنم.
بذارین صفر رو وارد کنم.
و می‌بینید: 'attempted to divide by zero'.
و بعد بذارین دوباره اجراش کنم و F رو وارد کنم.
و می‌بینید ارور.
می‌گه: 'The input string f was not in a correct format'.
پس این ارور هم البته عالی نیست، ولی حداقل به کاربر یک ایده‌ای می‌ده که چه خبره
تقریباً.
و در جزئیاتی که بهتون می‌ده، اغراق نمی‌کنه.
با این حال، اپلیکیشن‌مون به کارش ادامه داد و نتیجه همچنان نمایش داده شد.
پس این فقط یک مثال بود از کاری که 'try and catch' می‌تونه انجام بده.
و ما از این 'exception' استفاده می‌کنیم.
یا داریم این 'exception' به اسم X رو دریافت می‌کنیم.
و می‌تونیم از جزئیاتش استفاده کنیم تا نمایش بدیم 'exception' یا ارور در مورد چی بود.
پس اگه اینجا از X استفاده کنید، می‌بینید که چند تا 'method' (متد) موجود هستن، اما چند تا 'property' (پراپرتی) هم هستن.
پراپرتی.
پس 'message' (پیام) یکی از اوناست که ما استفاده کردیم.
اگه بخواین اطلاعات بیشتری به دست بیارید، می‌تونید 'stack trace' رو هم بگیرید.
و بله، اینا به نظرم مفیدترین‌ها هستن.
پس این اولین نگاه ما به 'try and catch' بود.
پس در ویدئوی بعدی، عمیق‌تر واردش می‌شیم.
ما هنوز یک کلمه کلیدی دیگه در این زمینه‌ی 'try and catch' داریم که اسمش 'finally' هستش.
پس شما رو در ویدئوی بعدی می‌بینم.