Ba'zan, dasturni bajarishda, oldindan ko'rish yoki ko'rish qiyin bo'lgan xatolar yuzaga keladi, ba'zan esa ularni umuman imkonsiz qiladi



Download 58,17 Kb.
Sana23.07.2022
Hajmi58,17 Kb.
#844842
Bog'liq
istisnolar


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:


  1. Konstruksiya try..catch..finally

  2. Catch blokini aniqlash

  3. 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




1

int y = x / 0;



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:


1
2
3
4

catch
{
// выполняемые инструкции
}

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.
Download 58,17 Kb.

Do'stlaringiz bilan baham:




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish