التقاط الاستثناءات باستخدام '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 للتعامل مع أنواع استثناءات مختلفة باستجابات مناسبة، مما يجعل معالجة الأخطاء لديك دقيقة وسهلة الاستخدام في آن واحد.
التحدي
سهلقم بإنشاء برنامج يوضح كيفية التقاط استثناءات محددة باستخدام الكلمة المفتاحية on. سيقوم برنامجك بمعالجة أنواع مختلفة من مدخلات المستخدم والتعامل مع أنواع استثناءات محددة برسائل خطأ مخصصة.
- اقرأ مدخلاً نصياً يمثل نوع العملية الرياضية (
"parse"، أو"divide"، أو"access") - اقرأ مدخلاً نصياً يمثل القيمة الأولى
- اقرأ مدخلاً نصياً يمثل القيمة الثانية (عند الاقتضاء)
- بناءً على نوع العملية، قم بإجراء العملية المقابلة باستخدام معالجة استثناءات محددة:
- بالنسبة لـ
"parse": قم بتحويل القيمة الأولى إلى عدد صحيح باستخدامint.parse()والتقطFormatExceptionبشكل محدد - بالنسبة لـ
"divide": قم بتحويل كلتا القيمتين إلى أعداد صحيحة وأجرِ عملية القسمة، مع التقاطFormatExceptionلأخطاء التحويل - بالنسبة لـ
"access": قم بإنشاء قائمة تحتوي على القيمة الأولى والوصول إلى الفهرس المحدد بواسطة القيمة الثانية، مع التقاطRangeErrorللفهارس غير الصالحة - اعرض النتائج أو رسائل الخطأ المحددة بالتنسيق الدقيق الموضح أدناه
على سبيل المثال، إذا كانت المدخلات هي "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 تعامل مع خطأ النطاق لعملية الوصول
}يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Logic & Flow
1التعامل المتقدم مع القوائم
خصائص القائمة: first و lastحالة القائمة: isEmpty و isNotEmptyعكس القائمةالإضافة إلى القائمة: insertالحذف من القائمة: removeWhereالبحث في القائمة: indexOfفرز القائمةخلط القائمةملخص - منظم القوائم4معالجة الـ Map المتقدمة
التكرار عبر الـ Mapالتحقق من المفاتيح والقيمخصائص الـ Map: keys و valuesإضافة مشروطة: putIfAbsentإزالة العناصر من الـ Mapالـ Maps المتداخلةمراجعة - تحديث المخزون2عمليات القوائم الوظيفية
التحويل باستخدام 'map'التصفية باستخدام 'where'استخدام '.toList()'التحقق من الشروط باستخدام 'any'الشروط باستخدام 'every'البحث باستخدام 'firstWhere'مراجعة - تصفية البيانات5مشروع: حاسبة عربة التسوق
إعداد المشروعإضافة العناصر إلى العربة3المجموعات
ما هي المجموعة؟إنشاء مجموعةالإضافة والحذف من المجموعاتالتحقق من وجود عناصر في المجموعةتحويل قائمة إلى مجموعةاتحاد المجموعاتتقاطع المجموعاتالفرق بين المجموعاتمراجعة - قائمة ضيوف فريدة6أساسيات معالجة الأخطاء
ما هي الاستثناءات؟كتلة 'try-catch'التقاط الاستثناءات باستخدام 'on'كتلة 'finally'رمي استثناءملخص - القسمة الآمنة