O`ZBEKISTON RESPUBLIKASI
OLIY VA O`RTA MAXSUS TA`LIM VAZIRLIGI
Buxoro Davlat Universiteti Axborot texnalogiyalari fakulteti
Algoritm tillari va dasturlash fanidan
Mustaqil ish
Mavzu: C# dasturlash tilida istisno holatlar bilan ishlash
Bajardi: 1-2 ATT-20 guruh talabasi
Mamatova Feruza
Tekshirdi: Jo`rayev Z.
Buxoro – 2021
Reja:
Konstruksiya try..catch..finally
Catch blokini aniqlash
Istisno filtrlari
Konstruksiya try..catch..finally
Ba'zan, dasturni bajarishda, oldindan ko'rish yoki ko'rish qiyin bo'lgan xatolar yuzaga keladi, ba'zan esa ularni umuman imkonsiz qiladi. Masalan, faylni tarmoq orqali uzatishda tarmoq ulanishi kutilmaganda uzilib qolishi mumkin. bunday holatlar istisno deb ataladi. C # tili ishlab chiquvchilarga ushbu vaziyatlarni boshqarish qobiliyatini beradi. Buning uchun C # try ... catch ... finally konstruktsiyasidan foydalanadi.
1
2
3
4
5
6
7
8
9
10
11
12
|
try
{
}
catch
{
}
finally
{
}
|
Try ... catch..finally block dan foydalanilganda, try blokidagi barcha gaplar avval bajariladi. Agar ushbu blokda istisnolar qo'yilmagan bo'lsa, u bajarilgandan so'ng, nihoyat blok bajarilishini boshlaydi. Va keyin..soz..topincha qurish o'z ishini yakunlaydi.
Agar urinish blokiga istisno tashlansa, u holda normal ijro to'xtaydi va CLR istisno bilan ishlay oladigan tutash blokni qidirishni boshlaydi. Agar kerakli catch bloki topilsa, u bajariladi va u tugagandan so'ng nihoyat blok bajariladi.
Agar kerakli blokirovka bloki topilmasa, istisno yuzaga kelganda, dastur ishdan chiqadi.
Quyidagi misolni ko'rib chiqing:
1
2
3
4
5
6
7
8
9
10
11
|
class Program
{
static void Main(string[] args)
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
Console.WriteLine("Конец программы");
Console.Read();
}
}
|
Bunday holda, raqam 0 ga bo'linadi, bu esa istisno tashlanishiga olib keladi. Dasturni disk raskadrovka rejimida boshlaganimizda, Visual Studio-da istisno haqida ma'lumot beradigan oynani ko'ramiz:
Ushbu oynada System.DivideByZeroException turidagi istisno, ya'ni nolga bo'linishga urinish tashlanganini ko'ramiz. Tafsilotlarni ko'rish elementidan foydalanib, istisno haqida batafsil ma'lumotni ko'rishingiz mumkin.
Va bu holda biz uchun faqat dasturning bajarilishini yakunlash qoladi.
Bunday g'ayritabiiy dasturni bekor qilinishiga yo'l qo'ymaslik uchun, siz istisnolardan foydalanish uchun nihoyat qurish ... ni ishlatishingiz kerak. Keling, misolni quyidagicha yozamiz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class Program
{
static void Main(string[] args)
{
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
catch
{
Console.WriteLine("Возникло исключение!");
}
finally
{
Console.WriteLine("Блок finally");
}
Console.WriteLine("Конец программы");
Console.Read();
}
}
|
Bunday holda, biz yana blokda istisnoga ega bo'lamiz, chunki biz nolga bo'linishga harakat qilmoqdamiz. Va chiziqqa etib boorish
dastur ishlamay qoladi. CLR ovlash blokini topadi va boshqaruvni ushbu blokga o'tkazadi.
Catch blokidan so'ng, finally blok bajariladi.
Shunday qilib, dastur hali ham bo'linishni nolga tenglashtirmaydi va shunga ko'ra, ushbu bo'linish natijasini ko'rsatmaydi, ammo endi u ishdan chiqmaydi va istisno blok blokida ko'rib chiqiladi.
Shuni ta'kidlash kerakki, ushbu qurilishda sinash bloki talab qilinadi. Tugatish bloki bilan biz oxirgi blokni qoldirib yuborishimiz mumkin:
1
2
3
4
5
6
7
8
9
10
|
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
catch
{
Console.WriteLine("Возникло исключение!");
}
|
Aksincha, nihoyat blok bilan, biz blok blokni qoldirib, istisno qilolmaymiz:
1
2
3
4
5
6
7
8
9
10
|
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
finally
{
Console.WriteLine("Блок finally");
}
|
Biroq, C # sintaksisining nuqtai nazari bo'yicha, bu qurilish juda to'g'ri, ammo CLR kerakli ushlash blokini topa olmaganligi sababli, istisno ko'rib chiqilmaydi va dastur ishdan chiqadi.
Istisnolardan foydalanish va shartli qurilishlar
Bir qator istisnolarni ishlab chiquvchi tomonidan oldindan ko'rish mumkin. Masalan, dastur sonni kiritishni va uning kvadratini chiqarishni ta'minlaylik deylik:
1
2
3
4
5
6
7
8
9
|
static void Main(string[] args)
{
Console.WriteLine("Введите число");
int x = Int32.Parse(Console.ReadLine());
x *= x;
Console.WriteLine("Квадрат числа: " + x);
Console.Read();
}
|
Agar foydalanuvchi raqamni emas, balki qatorni, ba'zi boshqa belgilarni kiritsa, u holda dastur xatoga yo'l qo'yadi. Bir tomondan, aynan shu vaziyat yuzaga kelishi mumkin bo'lgan xatoni hal qilish uchun try..catch blokidan foydalanishingiz mumkin. Biroq, konvertatsiya qilishning haqiqiyligini tekshirish ancha maqbul bo'lar edi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static void Main(string[] args)
{
Console.WriteLine("Введите число");
int x;
string input = Console.ReadLine();
if (Int32.TryParse(input, out x))
{
x *= x;
Console.WriteLine("Квадрат числа: " + x);
}
else
{
Console.WriteLine("Некорректный ввод");
}
Console.Read();
}
|
Int32.TryParse () usuli konversiyani amalga oshirish mumkin bo'lsa, haqiqiy, agar imkonsiz bo'lsa, false qiymatini qaytaradi. Agar konversiya to'g'ri bo'lsa, x o'zgaruvchisi kiritilgan raqamni o'z ichiga oladi. Shunday qilib, try ... catch-dan foydalanmasdan, mumkin bo'lgan istisnoga dosh berishingiz mumkin.
Ishlash nuqtai nazaridan try..catch bloklaridan foydalanish shartli foydalanishdan ko'ra qimmatroq. Shuning uchun, iloji boricha, try..catch o'rniga, istisnolarni tekshirish uchun shartli konstruktsiyalardan foydalanish yaxshiroqdir.
Catch blokini aniqlash
catch bloki quyidagi shakllarga ega bo'lishi mumkin bo'lgan istisno bilan ishlash uchun javobgardir:
Sinov blokiga kiritilgan har qanday istisno bilan shug'ullanadi. Bunday blokning misoli yuqorida allaqachon namoyish qilingan.
1
2
3
4
|
catch (тип_исключения)
{
// выполняемые инструкции
}
|
Faqat catch buyrug'idan keyin qavs ichida ko'rsatilgan turga mos keladigan istisnolardan foydalanadi.
Masalan, faqat DivideByZeroException turidagi istisnolarni ko'rib chiqaylik:
1
2
3
4
5
6
7
8
9
10
|
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
catch(DivideByZeroException)
{
Console.WriteLine("Возникло исключение DivideByZeroException");
}
|
Ammo, agar DivideByZeroException-dan boshqa turdagi istisnolar sinash blokiga tashlansa, ular qayta ishlanmaydi.
1
2
3
4
|
catch (тип_исключения имя_переменной)
{
// выполняемые инструкции
}
|
Faqat catch buyrug'idan keyin qavs ichida ko'rsatilgan turga mos keladigan istisnolardan foydalanadi. Va istisno haqidagi barcha ma'lumotlar ushbu turdagi o'zgaruvchiga joylashtirilgan. Masalan:
1
2
3
4
5
6
7
8
9
10
|
try
{
int x = 5;
int y = x / 0;
Console.WriteLine($"Результат: {y}");
}
catch(DivideByZeroException ex)
{
Console.WriteLine($"Возникло исключение {ex.Message}");
}
|
Aslida, bu holat avvalgisiga o'xshaydi, faqat bu erda o'zgaruvchidan foydalaniladi. Bunday holda, tashlangan istisno haqida ma'lumot DivideByZeroException turini ifodalovchi ex o'zgaruvchiga joylashtiriladi. Va Message xususiyatidan foydalanib, biz xato haqidagi xabarni olishimiz mumkin.
Agar bizga istisno haqida ma'lumot kerak bo'lmasa, u holda avvalgi holatdagidek o'zgaruvchini qoldirish mumkin.
Istisno filtrlari
Istisno filtrlari ma'lum shartlarga asoslanib istisnolardan foydalanishga imkon beradi. Ularni qo'llash uchun catch iborasidan keyin qachon ifoda, keyin qavs ichida shart qo'yiladi:
1
2
3
4
|
catch when(условие)
{
}
|
Bunday holda, istisno faqat ifoda holat to'g'ri bo'lsa, ushlash blokida ko'rib chiqiladi. Masalan:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
int x = 1;
int y = 0;
try
{
int result = x / y;
}
catch(DivideByZeroException) when (y==0 && x == 0)
{
Console.WriteLine("y не должен быть равен 0");
}
catch(DivideByZeroException ex)
{
Console.WriteLine(ex.Message);
}
|
Bunday holda, y = 0 bo'lganligi sababli istisno qilinadi. Ikkita blok bloklari mavjud va ularning ikkalasi ham DivideByZeroException istisnolarini boshqaradi, ya'ni aslida nolga bo'linib tashlangan barcha istisnolar. Ammo birinchi blokda y == 0 && x == 0 sharti ko'rsatilganligi sababli, u istisnoga javob bermaydi - qachon, keyin so'z noto'g'ri qaytadi. Shuning uchun, CLR mos keladigan blok bloklarini qidirishni davom ettiradi va istisno bilan ishlash uchun ikkinchi tutash blokni tanlaydi. Natijada, agar biz ikkinchi tutish blokini olib tashlasak, unda istisno umuman ko'rib chiqilmaydi.
Do'stlaringiz bilan baham: |