محتويات الدورة
Dart
الأساسيات: القيم والغياب والمجموعات والكائنات الصالحة
العقود: الأنماط والواجهات العامة والنتائج غير المتزامنة
التكامل: الأهداف والموارد والتحقق والأدلة

Dart / الأساسيات: القيم والغياب والمجموعات والكائنات الصالحة / الدرس 6

فصل الرفض المتوقع عن الاستثناءات والتنظيف

استخدم tryParse وحدود on وcatch المنمطة وrethrow وfinally دون تحويل كل عيب إلى نجاح يبدو معقولا.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • اختر نتيجة عادية للمدخل غير الصالح أو إخفاقا مرميا وفقا لعقد المستدعي.
  • احفظ أسباب التشخيص والتنظيف المملوك مع تجنب الالتقاط الواسع أكثر من اللازم.

يختلف خطأ الإدخال المتوقع عن سوء الاستخدام البرمجي

غالبا ما يكون نص المستخدم المشوه نتيجة تحقق عادية، لا إخفاق تطبيق استثنائيا. تدعم int.tryParse ذلك مباشرة، بينما ترمي int.parse النوع FormatException للنص العددي غير الصالح. وقد ترمي دالة داخلية ArgumentError لمعامل ممنوع كي تكشف إساءة المستدعي. لا تتطلب Dart تصريحات استثناءات مفحوصة، فلا يسرد التوقيع وحده كل فشل محتمل. وثّق السلوك المهم وميّزه من حالات Error التي تشير كثيرا إلى عيب برمجي. لا تتظاهر المعالجة الواسعة بإمكان التعافي الصحيح من كل كائن قابل للرمي.

التقط الإخفاق الذي يفهمه الحد فقط

تختار on نوع الاستثناء، وتستطيع catch التقاطه وأثر الاستدعاءات اختياريا. ضيّق الكتلة المحمية بحيث يعني FormatException فعلا فشل التحليل المقصود. إذا جمع catch التحليل والتخزين والعرض، فقد يسمى عيب تنسيق آخر مدخلا خاطئا. يستخدم المثال نصا ثابتا ورسالة آمنة بدلا من كشف الاستثناء الخام للمستخدم. تطبع finally علامة للترتيب لا دليلا على إغلاق ملف أو مقبس أو اشتراك. لم يُنفّذ برنامج Dart أثناء التأليف.

dart معالج تحليل منمط وعلامة ترتيب التنظيف
void main() {
  try {
    final value = int.parse('bad');
    print(value);
  } on FormatException {
    print('invalid integer');
  } finally {
    print('parse finished');
  }
}
الناتج المتوقع
invalid integer
parse finished

المخرج المتوقع invalid integer ثم parse finished. لا ينتج التحليل قيمة، فلا يصل التدفق إلى print داخل try. المصدر توضيحي غير منفذ.

ترجم عمدا واحفظ الأسباب المفيدة

قد يترجم حد إخفاق مورد إلى نتيجة تطبيق، لكن عليه حفظ سياق تشخيصي آمن وعدم محو السبب. تعيد rethrow تمرير الاستثناء الجاري التعامل معه مع الحفاظ على معلومات أثره بصورة أنسب من اختلاق خطأ جديد غير مرتبط. لا تسجل أسرارا أو حمولات شخصية أو تفريغا غير محدود للكائنات لمجرد فائدة أثر الاستدعاء. البديل سياسة منتج لا نتيجة آلية للالتقاط. قد يضر إرجاع دفعة فارغة ناجحة بعد فشل التخزين أكثر من إخفاق صريح صادق.

استخدم تحقق تشغيل عندما تعتمد الصحة عليه

تُفحص assert في التنفيذ الذي يفعّل التوكيدات، ولا يجوز أن تكون تحقق الإنتاج الوحيد لبيانات غير موثوقة. يظل الحارس الصريح جزءا من التدفق العادي. يستخدم المجموع المحلي أدناه قاعدة عدد موجب ووحدة غير سالبة بقيم صغيرة ضمن مجال بسيط. إنه حساب تعليمي لا نظام مالي. تحدث ترجمة الخطأ عند main، وتعيد الدالة القابلة للاستخدام قيمة للصحيح. يجب أن يفحص الاختبار المخرج المقبول ومسار الرفض، لا عدد الاستثناءات الملتقطة فقط.

dart فحص معاملات صريح بدلا من قاعدة تعتمد assert وحدها
int subtotal(int count, int unit) {
  if (count <= 0 || unit < 0) {
    throw ArgumentError('invalid count or unit');
  }
  return count * unit;
}
void main() {
  print(subtotal(2, 15));
  try {
    subtotal(0, 15);
  } on ArgumentError {
    print('rejected arguments');
  }
}
الناتج المتوقع
30
rejected arguments

المخرج المتوقع 30 ثم rejected arguments. لا يحدث دفع أو عمل خارجي حقيقي. لم يُحلل الكود أو يُنفّذ بأدوات Dart.

يجب ألا يختلق التنظيف نتيجة مختلفة

تعمل finally عند مغادرة try وcatch وفقا لدلالات الاستثناء العادية. تجنب العودة منها أو رمي خطأ تنظيف غير مرتبط يحجب الإخفاق الأصلي المهم. قد تكون عقود إغلاق الموارد متزامنة أو غير متزامنة، وقد يحتاج اشتراك تدفق إلغاء؛ فطابق المورد الفعلي ولا تفترض نمط إغلاق عاما. تحتاج الإخفاقات غير المتزامنة حد Future أو Stream المناسب الذي يُشرح لاحقا، ولا يلتقطها دائما try متزامن حول إنشاء المهمة. سجّل التنظيف المتحقق فعلا، ولا تستنتج نجاحه من علامة مطبوعة.

الأخطاء الشائعة وإصلاحها

يُعرض كل إخفاق كمدخل مشوه.

لماذا يحدث؟
يغطي catch عمليات غير مرتبطة أو يتجاهل نوع الاستثناء.
كيف تصلحه؟
ضيّق العمل المحمي وترجم ما تفهم معناه فقط.
كيف تتجنب تكراره؟
افصل حدود التحليل وسياسة العمل والتخزين والعرض.

يختفي تحقق الإنتاج عند تعطيل التوكيدات.

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

تحجب عودة التنظيف استثناء سابقا.

لماذا يحدث؟
استبدل مسار التنظيف تدفق التحكم الأصلي.
كيف تصلحه؟
أزل العودة واحفظ النتيجة أو الإخفاق ذي المعنى.
كيف تتجنب تكراره؟
راجع التنظيف عند النجاح والفشل معا.

اختبر فهمك

1. لماذا لا ينبغي لواجهة التقاط كل كائن مرمي وإعادة قائمة فارغة؟

اعرض الحل المشروح

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

2. تُطبع علامة finally بعد عملية فاشلة. ما الذي ما زال يحتاج تحققًا؟

اعرض الحل المشروح

افحص المورد المملوك فعلا وهل اكتمل الإغلاق أو فشل، والآثار التجارية الجزئية، ونتيجة المستدعي. انتظر عقد التنظيف المطلوب للموارد غير المتزامنة. لا تثبت print محلية تراجعا بعيدا أو سلامة ملف أو إلغاء اشتراك. اذكر الفحوص المنفذة بدقة ولا تعتبر العلامة شهادة استعادة عامة.

أهم ما تعلمته

  • تحدد فئات الإخفاق ونطاق الالتقاط المنمط صدق الترجمة.
  • يجب أن يظل التحقق والتنظيف فعالين في إعداد التنفيذ الحقيقي.

المراجع الرسمية