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.

Shart asosida yoshning 18 dan kattaligini tekshirmoqdamiz va kichik bo’lganda istisno keltirib chiqaryabmiz. Exception ga bitta parametr yuboramiz. Shu istisno kuzatilgan vaqtda nima xabar chiqarish kerakligi bo’yicha yoki bo’sh holatda ham qoldirishimiz mumkin.

Barcha istisno va xatolar uchun 2 ta sinf mavjud : Exception va error. Har bir sinfda o’zining turlari bor:

Exception

  • DeferredLoadException
  • FormatException
  • IntegerDivisionByZeroException
  • IOException
  • FileSystemException
  • PathNotFoundException
  • HttpException
  • RedirectException
  • ProcessException
  • SignalException
  • SocketException
  • StdinException
  • StdoutException
  • TlsException
  • CertificateException
  • HandshakeException
  • WebSocketException
  • IsolateSpawnException
  • TimeoutException
  • NullRejectionException
  • OSError

Error

  • ArgumentError
  • IndexError
  • RangeError
  • AssertionError
  • AsyncError
  • ConcurrentModificationError
  • JsonUnsupportedObjectError
  • JsonCyclicError
  • NoSuchMethodError
  • OutOfMemoryError
  • RemoteError
  • StackOverflowError
  • StateError
  • TypeError
  • UnimplementedError
  • UnsupportedError

Biz hal qilmoqchi bo’lgan istisno yoki xatoni on bloki bilan alohida belgilash imkonimiz bor. catch bloki bunday holatda ishlatilmasligi ham mumkin. Chunki u muayyan aynan bitta emas, balki barcha istisno va xatolar bilan ishlash uchundir.

void main() {
try {
int a = 2;
int b = 0;
int c = a ~/ b;
print(c);
}
on IntegerDivisionByZeroException {
print("0 ga bo'lish xatoligi bajarildi");
}
}
>> 0 ga bo’lish xatoligi bajarildi

Bunday xato va istisnolar ko’p uchrasa, ularning har biri uchun on blokini ishlatib chiqa olamiz ajratgan holatda.

Mana bu kodda 2 ta istisno kelib chiqadi, lekin birinchi FormatException istisnosi bajarilgani uchun shu istisno belgilangan on bloki orqali ushlab olinadi.