6- ma’ruza. O‘rnatilgan tizimlarga uzilish ish tartibini joriy etish


Dasturda uzilishlar, xatoliklar va istisnolarga sharhlar


Download 25.83 Kb.
bet4/4
Sana18.10.2023
Hajmi25.83 Kb.
#1708757
1   2   3   4
Bog'liq
6- ma’ruza. O‘rnatilgan tizimlarga uzilish ish tartibini joriy e-fayllar.org

6.4. Dasturda uzilishlar, xatoliklar va istisnolarga sharhlar
Biz o‘zimizga qanday baho bermaylik, mukammal dasturlovchilar bo‘lmaydi. Dasturiy ta’minot murakkab ish bo‘lib hisoblanadi. Shuning uchun eng mukammal dasturlovchilarda ham har xil “muammolar” bo‘lib turadi. Ayrim hollarda bu muammolarning sababi, “yomon yozilgan kod” bo‘lsa, (masalan, massiv chegarasidan oshib ketishiga yo‘l qo‘yish bo‘lsa) boshqa holda foydalanuvchi ma’lumotlarni xato kiritishi (aytaylik, telefon raqamlari uchun joy, “Chucky” ma’nosidagi ma’lumotlar). Muammoga nima sabab bo‘lishidan qat’iy nazar oxir-oqibatda ilovalar ko‘p hollarda ishlamaydi. Istisnolarni qayta ko‘rib chiqishdan oldin, 3 ta keng tarqalgan terminlarni ko‘rib chiqamiz:
Dasturiy xatoliklar. Dasturlovchi yo‘l qo‘ygan xatolarni shunday ataydilar. Masalan, ilova boshqarib bo‘lmaydigan S++ tilida yaratilgan bo‘lsa. Agar dinamik xotira tozalanmagan bo‘lib, xotira yo‘qolishiga asos bo‘lsa, dasturiy xato kelib chiqadi.
Foydalanuvchilar xatolari. Boshqa tomondan, foydalanuvchi xatolari ilova kirituvchilar tomonidan ya’ni ilovalarni tuzgan kishilar tomonidan emas. Masalan, oxirgi foydalanuvchi, kiritishlar va kodlarda korrekt kiritishlarni qayta ishlash ko‘zda tutilmagan bo‘lishi mumkin.
Istisnolar. Istisnolar deb, dasturlash davomida nafaqat qiyin ba’zida dasturlash ilovalarida umuman ko‘zda tutib bo‘lmaydi. Istisnoga misol qilib, quyidagilarni aytish mumkin:
Shu vaqtda avtonom rejimda turgan mashina yoki fayl bilan aloqani o‘rnatish. Har qaysi holatda ham dasturlovchi (yoki oxirgi foydalanuvchi) bunday istisno holatlarda nima qila olishi mumkin?
Yuqoridagilarni inobatga olib, barchasi tushunarli bo‘lishi kerakligi, .NETdan istisnolarni strukturali qayta ishlab chiqish-bu qabul istisno holatlar uchun mo‘ljallangan bo‘lib, ular bajarayotgan vaqtda sodir bo‘ladi.
Dasturlovchining ko‘zi ilg‘amay qolgani kabi dasturlovchining yoki foydalanuvchining xatolari CLR orasida tez-tez mos keluvchi istisnolar hosil qiladilar va paydo bo‘lgan muammolar haqida ma’lumot beradilar. NET baza sinflarining kutubxonasida ko‘plab har xil istisnolar topilgan. Ularga FormatException, IndexOutOfRangeException, FileNotFoundException, ArgumentOutOfRangeException va hokazolar kiradi. NET terminologiyasida “istisno” deganda foydalanuvchi kiritadigan va bajarish vaqtidagi xatolar, hatto biz dasturlovchilar har bir xato turini bir alohida muammo sifatida ko‘rishimiz mumkin. Detallarga botib qolmasdan, avval istisnolarni strukturali qayta ishlash va ko‘rib chiqish kerakki, ular an’anaviy xatolarni aniqlashdan nimasi bilandir farq qilishi kerak.

YeSLATMA! Kod misollarining maksimal oddiyligi uchun hamma istisnolarni ko‘rib chiqmaymiz. Boshqa tomondan, ishlab chiqarish darajasidagi proektlarda mavjud talablarga muvofiq ish ko‘rishga to‘g‘ri keladi.


.NET istisnosining qayta ishlash roli


.NET platformasi paydo bo‘lgunga qadar Windows operatsion sistemalarda xatolarni qayta ishlash o‘zi bilan yetarli darajada aralash texnologiyalarni tashkil etgan. Ko‘plab dasturlovchilar o‘zlarining mantiqiy xatolarni qayta ishlashga aloqador ilovalarni taklif qiladilar. Masalan, navbatdagi S tilidagi fragment kodi bilan ko‘rib chiqamiz:

/* A very C-style error trapping mechanism. */


#define E_FILENOTFOUND 1000
int UseFileSystem()
{
// Assume something happens in this function
// that causes the following return value.
return E_FILENOTFOUND;
}
void main()
{
int retVal = UseFileSystem();
if(retVal == E_FILENOTFOUND)
printf("Cannot find file...");
}

O‘zgarmas E_FILENOTFOUND- bu o‘ziga xos sanoq ma’nosidagi, muammoni qanday yechishni anglatib, bu yondashuv faktlardan yiroqroq yondashuv. Xabarlarda yozilgan, xatolar nomi o‘ziga xos haqqoniyligi va boshqa xatolar paydo bo‘lishi haqidagi axborotlar yagona bo‘lgan yaxshi aniq paketga joylashtirilgan (aynan shu narsa istisnolarni qayta ishlash strukturasida sodir bo‘ladi). Ishlab chiqaruvchilar tomonidan ishlangan WindowsAPI interfeysida yuzlab xatoliklar kodlari aniqlangan. Ular ko‘plab oddiy bool ma’nosida (bool, BOOL, VARIANT_BOOL va boshqalar) va #define va HRESULT ko‘rinishiga mos tushadi. Bundan tashqari SOM klientlariga xatoliklar qaytarish haqidagi ma’lumotlarni ko‘pgina SOM ilova S++ da ishlovchi ishlab chiqaruvchilar quyidagi standart SOM interfeyslarini ishlatadilar (masalan, IsupportErrorInfo. IerrorInfo,ICreateErrorInfo).

Balkim bu barcha eski metodlarning muammosi simmetriya yo‘qligidadir. Ularning har biri ko‘p yoki kam miqdorda qandaydir bir yagona texnologiya qolipiga kirib qolganligidir. Balkim bir til yoki bitta proektdadir. Bu savollarga nuqta qo‘yish uchun .NET sistemasiga xatolarni generatsiyalash va aniqlash uchun standart metodika ta’sis etildi, ya’ni istisnolarni strukturalangan qayta ishlanishi.
Bu metodning afzalligi shundan iboratki, endi ishlab chiqaruvchilar unifitsirlangan xatolarni qayta ishlash metodiga egadirlar, bu metod .NET platformasidagi barcha tillar uchun umumiydir. Bundan ko‘rinib turibdiki, S# da ishlayotgan dasturchi xatoliklarni qayta ishlashi, xuddi VB, C++, CLI da xatolarni qayta ishlayotgan dasturlovchilarning metodiga o‘xshab ketadi.
Qo‘shimcha afzalliklar shu bilan bog‘liqki, istisnolarni ushlash va generatsiyalash sintaksisi mashinalarda eng identik deb hisoblanadi.
Masalan, Windows Communication Foundation (WCF) C# da SOAP chaqiruv kodi va kalit so‘zlar ko‘rinishi metod ichida bir xil ko‘rinishga ega. Yana bir .NET istisnolari afzalliklari shundaki, aralashib ketgan sonli ma’nolardan, oddiy joriy muammolardan farqliroq, ular o‘ziga xos muammolar tasvirini ko‘rsatadi va shuningdek, istisnolarning birinchi detal chaqiruvini namoyish etadi. Bundan tashqari, oxirgi foydalanuvchiga URL adresi va ma’lumotlarni ko‘rsata oladi, xatoliklar haqida batafsil ayta oladi. Bundan tashqari aynan dasturlovchi aniqlagan ma’lumotlarni ham ko‘rsata oladi.
NET sistemasidagi kirish bloki istisnolarni qayta ishlashi
Strukturalangan istisnolar qayta ishlanishining dasturlanishi quyidagi 4 ta o‘zaro bog‘langan qoidalardan tashkil topgan.
Istisno detallar ko‘rinishidagi sinf turi
Har xil hollarda istisnolar sinfini chaqiruv kodida generatsiyalash qurbiga ega a’zo
A’zoga qaratilgan, istisno paydo bo‘lishi mumkin bo‘lgan chaqiruvchi tomonidagi kod bloki
Mabodo paydo bo‘lgan istisnoni qayta ishlovchi (yoki ushlab turuvchi) kod bloki S# dasturlash tilida 4 ta asosiy kalit so‘zini namoyish qiladi (try, catch, throw, finally), ular istisnoni qayta ishlash va generatsiya qilishga yordam beradi. Bularni inobatga olgan holda, siz bilan birga eng avvalo istisnolar bilan bog‘liq bo‘lgan bazaviy sinf rolini ko‘rib chiqamiz.
System.Exception baza sinfi
Barcha istisnolar oxir-oqibatda ArithmeticException_Demo, ArrayIndexOutOfBounds Exception, ClassNotFoundException lardan foydalaniladi. Pastda bu sinfning asosiy qismi ko‘rsatilgan (e’tiboringizni shunga qaratishingiz lozimki, ba’zi bir a’zolar virtualdir va bundan xulosa qilish mumkinki, ular boshqa sinflardan tashkil topgan):

ESLATMA! Exception sinfi 2 ta NET interfeysini joriy qiladi. Interfeyslar hozirgacha mukammal ko‘rib chiqilmagan bo‘lsada, shuni bilish kerakki, _Exception NET istisnosini beradi va u boshqarib bo‘lmaydigan kodli baza bilan qayta ishlanadi.


7.1 -jadval: Exceptionning asosiy xususiyatlari:


throw

Exception bilan birgalikda foydalaniladi

Data

bu xususiyat faqat o‘qish uchun mo‘ljallangan bo‘lib, ma’lumotlarni olishga yordam beradi.

ArithmeticException


bu xususiyat fayllardan xatolarni tuzatish va URL larni o‘rnatadi


Throwable


bu faqatgina o‘qilishi mumkin bo‘lgan xossa bo‘lib, u oldindagi istisno yoki istisnolar haqida ma’lumot olish uchun ishlatiladi. Oldindagi istisnolar yozib olinishi eng oxirgi istisnoni konstruktorga uzatish orqali amalga oshiriladi


Throwable(String msg, Throwable cause)


bu faqat o‘qish imkonini beruvchi xossa bo‘lib, matndagi berilgan xatoni qaytarib beadi. Xato haqidagi xabar konstruktor parametridek o‘rnatiladi.


getCause() method


Bu usul xatolikni qaytarish uchun foydalaniladi


initCause(Throwable cause) method


bu faqatgina o‘qish uchun mo‘ljallangan bo‘lib, o‘z ichida chaqiruvlar qatorini saqlaydi.bu qator esa istisnolar shakllanishiga olib keladi. Bunday xususiyat juda foydaliligini tushunish qiyin emas.


Oddiy misol


Biz tartib bilan qayta ishlangan istisnolarni foydali tomonini ko‘rsatish uchun shunday sinf tashkil qilishimiz kerakki, ular istisno holatlarda generatsiya qiladi. Yangi konsol ilova proektini yaratamiz va unda 2 ta Sar va Radio sinfi ajratamiz, o‘rtasini “imeet” bilan bog‘laymiz. Radio sinfida yakka usul aniqlangan bo‘lib, u radiopriyomnikning yoqish va o‘chirishga javob beradi.

class Radio


{
public void TurnOn(bool on)
{
if (on)
Console.WriteLine("Jamming...");
else
Console.WriteLine("Quiet time...");
}
}

Radio sinfini yoqish orqali to‘ldirilganda shu narsa ko‘riladiki, foydalanuvchi oldindan ko‘rilgan yuqori tezlikni oshiradi, motor ishdan chiqadi, Car obektini ishchi bo‘lmagan holatga olib keladi. Bundan tashqari, car sinfi berilgan tezlik uchun bir necha xususiyatga ega, berilgan avtomobildan foydalanuvchi “drujestvennogo nazvaniya”, shu bilan birga car obekti yangi holatini o‘rnatuvchilar uchun har xil konstruktorlar.


class Car


{
// maksimal tezlik uchun o’zgarmas qiymat berish
public const int MaxSpeed=100;
//avtomobil holati
public int CurrentSpeed {get; set;}
public string PetName{get;set;}
// mashina liniyadan chiqib ketmaydimi?
private bool carIsDead;
//avtomobilda radiopriyomnik bor
private Radio theMusicBox=new Radio();
//konstruktorlar
public Car() {}
public Car(string name, int speed)
{
CurrentSpeed = speed;
PetName =name;
}
public void CrankTunes (bool state)
{
theMusicBox.TurnOn(state);
}
//avtomobilni tekshirish
public void Accelerate(int delta)
{
if(carIsDead)
Console.WriteLine(“{0} is out of order...”,PetName);
else
{
CurrentSpeed+=delta;
If(CurrentSpeed>MaxSpeed)
{Console.WriteLine(“{0} has overheated!”, PetName);
CurrentSpeed=0;
carIsDead=true;}
else
Console.WriteLine(“=>CurrentSpeed={0}”,CurrentSpeed);
}
}
}

Istisnolarni qayta ishlash strukturasi

static void Main(string[args])
{Console.WriteLine(“*****Simple Exception Example *****”);
Console.WriteLine(“=> Creating a car and stepping on it!”);
Car myCar=new Car(“Zippy”,20);
myCar.CrankTunes(true);
for(int i=0;i<10;i++)
myCar.Accelerate(10);
Console.ReadLine();
}
Keying kiritilgan kod natijasi:
***** Simple Exception Example *****
=>Creating a car and stepping on it!
Jamming…
=>CurrentSpeed=30
=>CurrentSpeed=40
=>CurrentSpeed=50
=>CurrentSpeed=60
=>CurrentSpeed=70
=>CurrentSpeed=80
=>CurrentSpeed=90
=>CurrentSpeed=100
Zippy has overheated!
Zippy is out of order…
Umumiy istisnoning generatsiyasi
Funksional Car sinfi borligida istisno generatsiyasining oddiy usulini endi ko‘rib chiqamiz. Accelerate() ning joriy tadbiq qilinishi xatolik haqida oddiy ma’lumot beradi. Agar chaqiruvchi kod avtomobilni maksimal tezlikka ko‘tarishga intilsa.
Istisnolarni Tugatish
Accelerate() metodi qanchalik istisnolarni generatsiya qilish qobiliyatiga ega bo‘lsa ham, chaqiruvchi kod uni qayta ishlashga tayyor bo‘lishi kerak, ya’ni u kutilmaganda pado bo‘lganda. Istisnolarni generatsiya qiluvchi metodni chaqirishda try/catch blogi ishlatilishi kerak. Istisno obektini tugatgandan so‘ng Uning boshqa a’zolariga detal asosidagi informatsiya muammosi sifatida murojaat qilish mumkin.
Bu detallar asosida nima ish qilish sizga bog‘liq. Bularni maxsus xisobot fayllarida saqlash yoki Windows hodisalar jurnalida yozish mumkin.
// Handle the thrown exception.
public class MyClass {
public static void main(String[ ] args) {
try {
int[] myNumbers = {1, 2, 3};
System.out.println(myNumbers[10]);
} catch (Exception e) {
System.out.println("Something went wrong.");
}
}
Umuman olganda blok try operatorlar bo‘limini tashkil etadi. Ish davomida ular istisnolarni tashkil etadi. Istisnolar aniqlansa boshqaruv catch blogiga o‘tadi. Boshqa tomondan agar ichki joylashuvdagi try istisnoga kelmasa, catch blogi to‘liq tashlab o‘tiladi va hammasi o‘z joyida qoldiriladi. Quyida berilgan dastur uchun testdagi kirish natijalari ko‘rsatiladi:
Nazorat savollari

  1. Istisnolar va xatoliklar ta’rifini keltiring.


  2. Dasturiy ta'minotni tuzatish texnikasi.


  3. Semantik dasturlash xatolar katalogi


  4. Mantiqiy ifodalarni noto'g'ri shakllantirish va ishlatish.


  5. Mantiqiy analizatorlar.




http://fayllar.org
Download 25.83 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




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