Istisnolarni qayta ishlash
try..catch..finally konstruktsiyasi
Ba'zida, dasturni bajarayotganda, oldindan ko'rish yoki oldindan bilish qiyin bo'lgan, ba'zan esa imkonsiz xatolar yuzaga keladi. Masalan, faylni tarmoq orqali uzatishda tarmoq ulanishi kutilmaganda uzilishi mumkin. bunday holatlar istisno deb ataladi. C # tili ishlab chiquvchilarga ushbu vaziyatlarni hal qilish imkoniyatini beradi. Buning uchun C # da try... catch... finally konstruktsiyasi mo‘ljallangan.
try
{
}
catch
{
}
finally
{
}
try ... catch..final blokirovkadan foydalanganda, birinchi navbatda try blokidagi barcha amallar bajariladi. Agar bu blokda istisnolar qo'yilmagan bo'lsa, u bajarilgandan so'ng, oxirgi finally blok bajarila boshlaydi. Keyin try..catch..finally construct o'z ishini yakunlaydi.
Agar try blokida to‘xtatilsa, oddiy bajarish tartibi to‘xtatiladi va CLR muhiti ushbu istisnoni qayta ishlay oladigan catch blokini qidirishni boshlaydi. Agar zarur catch bloki topilsa, u bajariladi va bajarilgandan so‘ng finally bloki bajariladi.
Agar zarur catch bloki topilmagan bo‘lsa, u holda istisno yuz berganda dastur favqulodda bajariladi.
Quyidagi misolni ko‘rib chiqamiz:
class Program
{
static void Main(string[] args)
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Natija: {y}");
Console.WriteLine("Dastur oxiri");
Console.Read();
}
}
Bu holatda sonni 0 ga bo‘lish yuzaga keladi, bu holat istisno yuzaga kelishiga olib keladi. Dasturni Visual Studiodan boshlash rejasida ishga tushirishda quyidagilar haqida ma’lumot beradigan oynani ko‘rishimiz mumkin:
Ushbu oynada Systemi.DiivideByZeroException turidagi istisno yuz bergan, ya’ni nolga bo‘lish qo‘llanmoqda. View Details punkti yordamida chiqarish to‘g‘risidagi batafsil ma’lumotlarni ko‘rib chiqish mumkin.
Bunday holda bizga qoladigan yagona holat – dasturni bajarishni yakunlashdan iborat.
Dasturning bunday favqulodda yakunlanishiga yo‘l qo‘ymaslik uchun try... catch... finally konstruktsiyasidan foydalanish kerak. Shuningdek, misolni quyidagi tarzda o‘zgartirib o‘tamiz:
class Program
{
static void Main(string[] args)
{
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Natija: {y}");
}
catch
{
Console.WriteLine("Istisno halat!");
}
finally
{
Console.WriteLine("finally blogi");
}
Console.WriteLine("Dastur oxiri");
Console.Read();
}
}
Mazkur holatda yanada try blokida istisno yuz berdi, chunki biz nolga bo‘lishga harakat qilmoqdamiz.
int y = x / 0;
Dasturni amalga oshirish to‘xtatiladi. CLR catch blokini topib, boshqaruvni ushbu blokga topshiradi.
catch blokidan keyin finally bloki bajariladi.
Shu tariqa, dastur nolga bo‘lishni bajarmaydi va tegishli ravishda ushbu bo‘lish natijasini chiqarmaydi, lekin endilikda uning holati avariya yo‘li bilan yakunlanmaydi, istisno catch blokida ishlanadi.
Ta’kidlash joizki, ushbu konstruktsiyada try bloki majburiy. Catch bloki mavjud bo‘lganda, biz finally blokini tashlab qo‘yishimiz mumkin:
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Natija: {y}");
}
catch
{
Console.WriteLine("Istisno halat!");
}
Bundan tashqari, finally bloki mavjud bo‘lganda catch blokini tushirib, istisnoni qayta ishlab chiqmaslik mumkin:
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Natija: {y}");
}
finally
{
Console.WriteLine("finally blogi");
}
Biroq, C # sintaksisi nuqtai nazaridan bunday konstruktsiya to‘g‘ridan-to‘g‘ri bo‘lgan bo‘lsa-da, shuningdek, CLR zarur catch blokini topib bo‘lmagani uchun istisno qayta ishlanmaydi va dastur avariya yakunlanadi.
Istisnolarni qayta ishlash va shartli konstruktsiyalar
Bir qator istisno vaziyatlar ishlab chiqaruvchi tomonidan ko‘zda tutilishi mumkin Masalan, dastur sonni kiritish va uning kvadramini chiqish:
static void Main(string[] args)
{
Console.WriteLine("Sonni kiriting");
int x;
string input = Console.ReadLine();
if (Int32.TryParse(input, out x))
{
x *= x;
Console.WriteLine("Sonning kvadrati: " + x);
}
else
{
Console.WriteLine("korrekt bo’lmagan kiritish");
}
Console.Read();
}
Aylantirishni amalga oshirish mumkin bo‘lsa, Int32.TryParse () usuli true va false - mumkin bo‘lmasa, qaytaradi. Aylantirish mumkin bo‘lganda, x o‘zgaruvchisi kiritilgan sonni o‘z ichiga oladi. Jumladan, try... catch ’ dan foydalanmasdan, mumkin bo‘lgan foydalanilmagan vaziyatni qayta ishlash mumkin.
Unumdorlik nuqtai nazaridan try.. catch bloklaridan foydalanish shartli konstruktsiyalardan foydalanishga nisbatan yo‘nalishli. Shuning uchun zarur holatlarni tekshirish uchun shartli konstruktsiyalardan foydalanish mumkin.
Do'stlaringiz bilan baham: |