logo

ISTISNOLI HOLATLAR VA ULARNI QAYTA ISHLASH.

Загружено в:

16.11.2024

Скачано:

0

Размер:

54.6513671875 KB
I STI SN OL I  HOL ATL A R VA  UL A RN I  QAY TA  I SHL A SH.
I STI SN OL I  HOL ATL A R  A SOSLA RI . I STI SN OL I  HOLATL A R N I
GEN ERA SI YA  QI LI SH. I STI SN OL I  HOLATL A R N I  USHL A SH. •
C++  kodini  bajarishda  turli  xil  xatolar  yuzaga  kelishi  mumkin:  dasturchi 
tomonidan  kodlash  xatolari,  noto'g'ri  kiritilgan  xatolar  yoki  boshqa  oldindan 
aytib bo'lmaydigan narsalar .
•
Xato  sodir  bo'lganda,  C++  odatda  to'xtaydi  va  xato  xabarini  yaratadi. Buning 
texnik atamasi: C++  i st i sno  (xato) chiqaradi.
•
I st isno   -  bu  dasturni  bajarish  jarayonida  yuzaga  keladigan  muammo. C++ 
istisnosi dastur ishlayotgan vaqtda yuzaga keladigan istisno holatlarga javobdir, 
masalan, nolga bo'lishga urinishi.
•
Istisnolar  dasturning  bir  qismidan  boshqasiga  boshqaruvni  o'tkazish  usulini 
ta'minlaydi. C++  istisnolarini  qayta  ishlash  uchta  kalit  so'z  asosida  qurilgan:  t ry  
(u ri ni b k o'r i ng), cat ch (t ut i ng), v a  t hrow  (t a sh l ang).
•
C++ da  t hrow  iborasi istisno yoki xato haqida signal berish uchun ishlatiladi. 
Istisno sodir bo'lganligi haqida signal berish istisnoni generatsiyasi deb ataladi. •
t hrow   operatoridan  foydalanish  uchun  siz  throw  kalit  so'zidan  keyin  xato  haqida  signal 
berish uchun foydalanmoqchi bo'lgan har qanday ma'lumot turi qiymatidan foydalanasiz. 
Odatda,  bu  qiymat  xato  kodi,  muammoning  tavsifi  yoki  maxsus  istisno  sinfi  bo’lishi 
mumkun.
•
throw -1; // int tipidagi istisno generatsiyasi
•
throw ENUM_INVALID_INDEX; // enum tipidagi generatsiya
•
throw "Manfiy sonning kvadrat ildizini olib bo'lmaydi"; // const char * tipidagi  istisnoni generatsiyasi 
(C uslubidagi satr)
•
throw dX; // double turidagi istisno generatsiyasi (oldin aniqlangan double tipidagi o'zgaruvchi)
•
throw MyException("Fatal Error"); // MyException sinfining obyekti yordamida istisno qilish try
{
// Bu erda biz keyingi istisnolarni generatsiya qiladigan 
bayonotlarni yozamiz
throw -1; //
} •
t r y  blokidan  keyingi  ca t ch  bloki har  qanday  istisnoni  aniqlaydi. Qaysi  turdagi 
istisnolarni  aniqlashni  xohlayotganingizni  belgilashingiz  mumkin  va  bu  catch 
kalit  so'zidan  keyin  qavs  ichida  paydo  bo'ladigan  istisno  qoidasi  bilan 
aniqlanadi.
•
t r y   bloki  bir  xil  t r y   blokidagi  har  qanday  bayonot  tomonidan  chiqarilgan 
istisnolarni qidiradigan kuzatuvchi sifatida ishlaydi, masalan:
try
   {
          // Bu erda biz keyingi istisnolarni generatsiya qiladigan bayonotlarni yozamiz
         throw -1; //
    }
E'tibor bering, try bloki istisnoni  qanday  hal qilishimizni aniqlamaydi. •
Istisnolarni  qayta  ishlash  catch  blokining  ishi.  ca t ch   kalit  so'zi  ma'lum  bir  turdagi 
ma'lumotlarning  istisnolarini  ko'rib  chiqadigan  kod  blokini  aniqlash  uchun 
ishlatiladi.
•
Bu yerda int tipidagi istisnolarni ko‘rib chiqadigan (tutadigan) catch blokiga misol:
•
try  va  catch  bloklari  birgalikda  ishlaydi.  try  bloki  unga  kiritilgan  har  qanday 
istisnolarni  aniqlaydi  va  ularni  qayta  ishlash  uchun  tegishli  catch  blokiga 
yo'naltiradi. Try blokida darhol o'zidan keyin kamida bitta catch bloki  bo'lishi kerak, 
lekin u ketma-ket (birin-ketin) bir nechta catch bloklariga ega bo'lishi ham mumkin. catch (int a)
   {
// int tipidagi istisno bilan ishlash
cerr << "Biz qiymat bilan int istisnosini ushladik" << a << '\n';
    } •
Istisno  try  bloki  tomonidan  ushlangan  va  ishlov  berish  uchun  catch  blokiga 
yo'naltirilgandan  so'ng,  u  ishlov  berilgan  deb  hisoblanadi  (catch  blok  kodi   
ajarilgandan so'ng) va dasturning bajarilishi davom ettiriladi.
•
Yuqoridagi  kod  Except i on N am e  turidagi  istisnoni  ushlaydi. Agar  siz  catch  bloki 
try  blokiga  tashlangan  boshqa  bir  istisno  turini  boshqarishi  kerakligini 
belgilamoqchi  bo'lsangiz,  istisno  qoidasini  qavslar  orasiga  quyidagi  tarzda  ... 
qo'yishingiz kerak try { 
//  himoyalangan kod
} catch( ExceptionName e ) {
//  ExceptionName istisnosini boshqarish uchun kod  
  }  
try { 
// protected code 
} catch(...) {
  //  har qanday istisnoni hal qilish uchun kod  
}   •
Funktsiyalarda bo'lgani kabi, agar parametr catch blokida ishlatilmasa, 
o'zgaruvchining nomini o'tkazib yuborish mumkin:
catch (double)  
// Eslatma: Biz o'zgaruvchining nomini ko'rsatmaymiz,
//chunki bunga ehtiyoj yo'q (biz uni blokning biron bir 
joyida ishlatmaymiz)
{
// Bu yerda double tipli istisno bilan ishlash
cerr << "Biz double turini istisno qildik" << '\n';
} •
Quyida nol istisnoga bo'linishni ushlaydigan misol keltirilgan va biz uni catch 
blokida ushlaymiz.
#include   <iostream>
using   namespace  std ;  
double  division ( int  a ,   int  b )   {  
if (  b  ==   0   )   {  
throw   " Nol shartga bo'linish ! " ;  
}  
return   ( a / b );  
}  
int  main  ()   {  
int  x  =   50 ;  
int  y  =   0 ;  
double  z  =   0 ;  
try   {  
z  =  division ( x ,  y );  
cout  <<  z  <<  endl ;  
}   catch   ( const   char *  msg )   {  
cerr  <<  msg  <<  endl ;  
}  
return   0 ;  
}

I STI SN OL I HOL ATL A R VA UL A RN I QAY TA I SHL A SH. I STI SN OL I HOL ATL A R A SOSLA RI . I STI SN OL I HOLATL A R N I GEN ERA SI YA QI LI SH. I STI SN OL I HOLATL A R N I USHL A SH.

• C++ kodini bajarishda turli xil xatolar yuzaga kelishi mumkin: dasturchi tomonidan kodlash xatolari, noto'g'ri kiritilgan xatolar yoki boshqa oldindan aytib bo'lmaydigan narsalar . • Xato sodir bo'lganda, C++ odatda to'xtaydi va xato xabarini yaratadi. Buning texnik atamasi: C++  i st i sno  (xato) chiqaradi. • I st isno - bu dasturni bajarish jarayonida yuzaga keladigan muammo. C++ istisnosi dastur ishlayotgan vaqtda yuzaga keladigan istisno holatlarga javobdir, masalan, nolga bo'lishga urinishi. • Istisnolar dasturning bir qismidan boshqasiga boshqaruvni o'tkazish usulini ta'minlaydi. C++ istisnolarini qayta ishlash uchta kalit so'z asosida qurilgan: t ry (u ri ni b k o'r i ng), cat ch (t ut i ng), v a t hrow (t a sh l ang). • C++ da t hrow iborasi istisno yoki xato haqida signal berish uchun ishlatiladi. Istisno sodir bo'lganligi haqida signal berish istisnoni generatsiyasi deb ataladi.

• t hrow operatoridan foydalanish uchun siz throw kalit so'zidan keyin xato haqida signal berish uchun foydalanmoqchi bo'lgan har qanday ma'lumot turi qiymatidan foydalanasiz. Odatda, bu qiymat xato kodi, muammoning tavsifi yoki maxsus istisno sinfi bo’lishi mumkun. • throw -1; // int tipidagi istisno generatsiyasi • throw ENUM_INVALID_INDEX; // enum tipidagi generatsiya • throw "Manfiy sonning kvadrat ildizini olib bo'lmaydi"; // const char * tipidagi istisnoni generatsiyasi (C uslubidagi satr) • throw dX; // double turidagi istisno generatsiyasi (oldin aniqlangan double tipidagi o'zgaruvchi) • throw MyException("Fatal Error"); // MyException sinfining obyekti yordamida istisno qilish try { // Bu erda biz keyingi istisnolarni generatsiya qiladigan bayonotlarni yozamiz throw -1; // }

• t r y  blokidan keyingi  ca t ch  bloki har qanday istisnoni aniqlaydi. Qaysi turdagi istisnolarni aniqlashni xohlayotganingizni belgilashingiz mumkin va bu catch kalit so'zidan keyin qavs ichida paydo bo'ladigan istisno qoidasi bilan aniqlanadi. • t r y bloki bir xil t r y blokidagi har qanday bayonot tomonidan chiqarilgan istisnolarni qidiradigan kuzatuvchi sifatida ishlaydi, masalan: try { // Bu erda biz keyingi istisnolarni generatsiya qiladigan bayonotlarni yozamiz throw -1; // } E'tibor bering, try bloki istisnoni qanday hal qilishimizni aniqlamaydi.

• Istisnolarni qayta ishlash catch blokining ishi. ca t ch kalit so'zi ma'lum bir turdagi ma'lumotlarning istisnolarini ko'rib chiqadigan kod blokini aniqlash uchun ishlatiladi. • Bu yerda int tipidagi istisnolarni ko‘rib chiqadigan (tutadigan) catch blokiga misol: • try va catch bloklari birgalikda ishlaydi. try bloki unga kiritilgan har qanday istisnolarni aniqlaydi va ularni qayta ishlash uchun tegishli catch blokiga yo'naltiradi. Try blokida darhol o'zidan keyin kamida bitta catch bloki bo'lishi kerak, lekin u ketma-ket (birin-ketin) bir nechta catch bloklariga ega bo'lishi ham mumkin. catch (int a) { // int tipidagi istisno bilan ishlash cerr << "Biz qiymat bilan int istisnosini ushladik" << a << '\n'; }