Dart Istisnolar bilan ishlash

Dastur ishlashi davomida unda kelib chiquvchi va ishlashini buzuvchi holatlar mavjud. Bular turli xil sabablarga ko’ra bo’ladi. Bu uchun ham dasturchi shu holatlarni inobatga olib ketib dastur tuzishi kerak. Foydalanuvchining dasturdan noto’g’ri ishlatishi bularga sabab ham bo’ladi va shu uchun cheklovlar ham o’rnatiladi dasturda. Bu kabi xatolar istisnolar deb ataladi. Har bir dasturlash tilida bo’lgani singari Dart dasturlash tilida ham istisnolar bilan ishlashni qo’llab-quvvatlaydi va shu orqali dasturning ishdan chiqish holati oldi olinadi.

Matematikada bilamizki, kasr sonlar ko’rinishida berilib, a Z (butun son), b N (natural son) qiymatlarini qabul qiladi. Agarda maxraj nolga teng bo’lsa, kasr xato bo’ladi va bunday bo’lishi mumkin emas deb o’tiladi. Dasturlashda ham bu holat inobatga olib ketilgan.

void main() {
int a = 2;
int b = 0;
int c = a ~/ b;
print(c);
}

Dastur ishga tushirilgan vaqtda ~/ butun bo’lish amali bo’lgani uchun 2 / 0 ga bo’lishni tushinish mumkin. Bunda esa Dart dasturlash tili IntegerDivisionByZeroException istisnosini yuzaga chiqaradi va dasturni ishini yakunlaydi. Albatta butun bo’lish uchun. Kasrli bo’lish bo’lganda va u double turdagi o’zgaruvchiga o’zlashtirib olingan vaqtda hech qanday istisno bo’lmaydi va cheksizlik chiqadi.

void main() {
int a = 2;
int b = 0;
double c = a / b;
print(c);
}
>> Infinity

Dart dasturlash tilida bunday vaziyatlar uchun try, on, catch, finally bloklari mavjud :

try {
// istisnoga olib kelishi mumkin bo'lgan kod qismi
}
on istisno_turi {
// aynan bitta istisnoni tutib olib, ishlash
}
catch (e) {
// barcha istisnoni belgilab tutib olib, ishlash
}
finally {
// istisno bloki ishlagandan so'ng ishlaydi
}

Bu try, on, catch, finally blokidan foydalanilganda birinchi try bloki ichida kod ishga tushiriladi va istisno holati yuzaga kelganda on va catch bloklariga o’tadi. So’ng esa finally bloki oxirida bajariladi.

void main() {
try {
int a = 2;
int b = 0;
int c = a ~/ b;
print(c);
}
catch (e) {
print("0 ga bo'lish mumkin emas!");
}
}
>> 0 ga bo’lish mumkin emas!

0 ga bo’lish xatoligini tutib olamiz va ogohlantirish beramiz. catch(e) bloki ichidagi e istisno haqida ma’lumotni ifodalaydi.

void main() {
try {
int a = 2;
int b = 0;
int c = a ~/ b;
print(c);
}
catch (e) {
print("0 ga bo'lish mumkin emas! $e");
}
}
>> 0 ga bo’lish mumkin emas! IntegerDivisionByZeroException

finally bloki istisno holati yuzaga kelsa yoki kelmasa ham umumiy blok yakunlanganligi anglatadi. finally bloki ishlatilgan vaqtda catch bloki ishlatilmasa, xatolik finally bloki ishlagandan so’ng ko’rsatiladi. Quyidagi rasmda uni ko’rishingiz mumkin.

catch bloki parametrlari 2 ta bo’lib, ular e – istisno nomi haqida ma’lumot (exception), s – istisno haqida to’laqonli ma’lumot ko’rsatadi (stack). Qayerda bo’lganligi ko’rsatib beradi.

Qo’shimcha boshqa istisnoli holatlarni ham yaratishimiz mumkin. Buning uchun throw kalit so’zi va Exception sinfidan qo’llaniladi. Quyidagi kodga e’tibor bering.