Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التقاط الاستثناءات باستخدام 'on'

جزء من قسم Logic & Flow في رحلة Dart على Coddy — الدرس 40 من 65.

بينما تقوم كتلة try-catch الأساسية بالتقاط أي استثناء يحدث، فأنت تحتاج أحياناً إلى التعامل مع أنواع مختلفة من الاستثناءات بطرق مختلفة. تسمح لك الكلمة المفتاحية on بالتقاط أنواع محددة من الاستثناءات وتقديم استجابات مخصصة لكل منها.

بدلاً من التقاط جميع الاستثناءات باستخدام catch عامة، يمكنك استهداف استثناءات محددة باستخدام on متبوعة بنوع الاستثناء. يمنحك هذا تحكماً أكبر في كيفية استجابة برنامجك لمواقف الخطأ المختلفة.

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

في هذا المثال، يلتقط الكود بشكل خاص FormatException، والذي يحدث عند محاولة تحليل نص غير صالح كعدد. يتيح لك ذلك تقديم رسالة واضحة وسهلة الاستخدام تعالج المشكلة مباشرة، بدلاً من إظهار رسالة خطأ عامة قد تربك المستخدمين.

يمكنك أيضاً دمج عدة كتل on للتعامل مع أنواع استثناءات مختلفة باستجابات مناسبة، مما يجعل معالجة الأخطاء لديك دقيقة وسهلة الاستخدام في آن واحد.

challenge icon

التحدي

سهل

قم بإنشاء برنامج يوضح كيفية التقاط استثناءات محددة باستخدام الكلمة المفتاحية on. سيقوم برنامجك بمعالجة أنواع مختلفة من مدخلات المستخدم والتعامل مع أنواع استثناءات محددة برسائل خطأ مخصصة.

  1. اقرأ مدخلاً نصياً يمثل نوع العملية الرياضية ("parse"، أو "divide"، أو "access")
  2. اقرأ مدخلاً نصياً يمثل القيمة الأولى
  3. اقرأ مدخلاً نصياً يمثل القيمة الثانية (عند الاقتضاء)
  4. بناءً على نوع العملية، قم بإجراء العملية المقابلة باستخدام معالجة استثناءات محددة:
    • بالنسبة لـ "parse": قم بتحويل القيمة الأولى إلى عدد صحيح باستخدام int.parse() والتقط FormatException بشكل محدد
    • بالنسبة لـ "divide": قم بتحويل كلتا القيمتين إلى أعداد صحيحة وأجرِ عملية القسمة، مع التقاط FormatException لأخطاء التحويل
    • بالنسبة لـ "access": قم بإنشاء قائمة تحتوي على القيمة الأولى والوصول إلى الفهرس المحدد بواسطة القيمة الثانية، مع التقاط RangeError للفهارس غير الصالحة
  5. اعرض النتائج أو رسائل الخطأ المحددة بالتنسيق الدقيق الموضح أدناه

على سبيل المثال، إذا كانت المدخلات هي "parse"، و "42"، و "unused"، يجب أن يخرج برنامجك:

Operation: parse
Input: 42
Parsing successful!
Result: 42

إذا كانت المدخلات هي "parse"، و "xyz"، و "unused"، يجب أن يخرج برنامجك:

Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer

إذا كانت المدخلات هي "divide"، و "10"، و "2"، يجب أن يخرج برنامجك:

Operation: divide
Values: 10, 2
Division successful!
Result: 5

إذا كانت المدخلات هي "divide"، و "10"، و "abc"، يجب أن يخرج برنامجك:

Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers

إذا كانت المدخلات هي "access"، و "hello"، و "1"، يجب أن يخرج برنامجك:

Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0

يجب أن يستخدم برنامجك كتل try-catch منفصلة مع الكلمة المفتاحية on لالتقاط FormatException و RangeError بشكل محدد. يجب أن يكون لكل نوع استثناء رسالة خطأ مخصصة تشرح بوضوح ما حدث من خطأ. بالنسبة لعملية "access"، قم بإنشاء قائمة تحتوي فقط على قيمة المدخل الأول وحاول الوصول إلى الفهرس المحدد بواسطة قيمة المدخل الثاني.

ورقة مرجعية

استخدم الكلمة المفتاحية on لالتقاط أنواع محددة من الاستثناءات بدلاً من استخدام كتلة catch عامة:

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

يمكنك دمج عدة كتل on للتعامل مع أنواع مختلفة من الاستثناءات باستجابات مناسبة:

try {
  // بعض الأكواد التي قد تثير استثناءات مختلفة
} on FormatException {
  print("Invalid format error");
} on RangeError {
  print("Index out of range error");
}

يوفر هذا النهج تحكماً أكبر في معالجة الأخطاء من خلال السماح باستجابات مخصصة لكل نوع محدد من الاستثناءات.

جرّب بنفسك

import 'dart:io';

void main() {
  // قراءة المدخلات
  String? operation = stdin.readLineSync();
  String? firstValue = stdin.readLineSync();
  String? secondValue = stdin.readLineSync();
  
  // عرض معلومات العملية
  print('Operation: $operation');
  
  // TODO: اكتب الكود الخاص بك أدناه
  // استخدم كتل try-catch مع الكلمة المفتاحية 'on' للتعامل مع استثناءات محددة
  // FormatException تعامل مع استثناء التنسيق لعمليات التحليل والقسمة
  // RangeError تعامل مع خطأ النطاق لعملية الوصول
  
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Logic & Flow