هذه حقيقة مثيرة للاهتمام: لا الشفرة خالي من الأخطاء - في الواقع ، هناك بعض الرموز المليئة بـ "الأخطاء" عن قصد.
ما هو الخطأ في التطبيق؟ الخطأ هو حل مشفر بشكل غير صحيح لمشكلة. هذه هي أخطاء منطقية يمكن أن يؤدي إلى نتائج وظائف خاطئة حيث يبدو كل شيء جيدًا معًا ولكن نتيجة التطبيق غير قابلة للاستخدام تمامًا. مع وجود أخطاء منطقية ، و تطبيق قد يتوقف أو لا يتوقف عن العمل.
يمكن أن تتضمن الاستثناءات أخطاء في التعليمات البرمجية الخاصة بك حيث تحاول تقسيم الأرقام بصفر ، أو محاولة استخدام كتل الذاكرة المحررة أو محاولة توفير معلمات خاطئة لوظيفة. ومع ذلك ، هناك استثناء في تطبيق ليس خطأ دائمًا.
استثناءات وفئة الاستثناء
الاستثناءات هي شروط خاصة تتطلب معالجة خاصة. عند حدوث شرط نوع الخطأ ، يثير البرنامج استثناء.
ستتعامل أنت (بصفتك كاتب التطبيق) مع الاستثناءات لجعل تطبيقك أكثر عرضة للخطأ وللرد على الحالة الاستثنائية.
في معظم الحالات ، ستجد نفسك ككاتب للتطبيق وكاتب للمكتبة. لذلك ستحتاج إلى معرفة كيفية رفع الاستثناءات (من مكتبتك) وكيفية التعامل معها (من التطبيق الخاص بك).
المادة على معالجة الأخطاء والاستثناءات يوفر بعض الإرشادات الأساسية حول كيفية الحماية من الأخطاء باستخدام try / باستثناء / end ومحاولة / أخيرا / إنهاء الكتل المحمية للرد على الظروف الاستثنائية أو التعامل معها.
تجربة بسيطة / باستثناء كتل الحراسة تبدو مثل:
محاولة
ThisFunctionMightRaiseAnException ()؛
إلا/ / التعامل مع أي استثناءات مرفوعة في ThisFunctionMightRaiseAnException () هنا
النهاية;
قد يكون لدى ThisFunctionMightRaiseAnException ، عند تنفيذه ، سطر من التعليمات البرمجية مثل
رفع استثناء. إنشاء ("حالة خاصة!") ؛
الاستثناء هو فئة خاصة (واحدة من عدد قليل بدون T أمام الاسم) محددة في وحدة sysutils.pas. تحدد وحدة SysUtils العديد من نسل استثناء الأغراض الخاصة (وبالتالي يخلق هرمية من فئات الاستثناء) مثل ERangeError و EDivByZero و EIntOverflow ، إلخ.
في معظم الحالات ، لن تكون الاستثناءات التي ستتعامل معها في التجربة المحمية / باستثناء الكتلة من الاستثناء الفئة (الأساسية) ولكن من فئة خاصة سلالة استثنائية محددة إما في VCL أو في المكتبة أنت باستخدام.
معالجة الاستثناءات باستخدام المحاولة / باستثناء
لالتقاط نوع الاستثناء ومعالجته ، يمكنك إنشاء معالج استثناء "في type_of_exception القيام به". يشبه "الاستثناء" إلى حد كبير بيان الحالة الكلاسيكية:
محاولة
ThisFunctionMightRaiseAnException ؛
باستثناء EZeroDivide dobegin// شيء عند القسمة على صفرالنهاية;
على EIntOverflow dobegin// شيء عند حساب عدد صحيح كبير جدًاالنهاية;
غير ذلك// شيء عند رفع أنواع استثناءات أخرىالنهاية;
النهاية;
لاحظ أن الجزء الآخر سيأخذ كل الاستثناءات (الأخرى) ، بما في ذلك تلك التي لا تعرف عنها شيئًا. بشكل عام ، يجب أن تتعامل الشفرة الخاصة بك مع الاستثناءات فقط التي تعرف بالفعل كيفية التعامل معها وتتوقع طرحها.
أيضًا ، يجب ألا "تأكل" أبدًا استثناء:
محاولة
ThisFunctionMightRaiseAnException ؛
إلا
النهاية;
يعني تناول الاستثناء أنك لا تعرف كيفية التعامل مع الاستثناء أو أنك لا تريد أن يرى المستخدمون الاستثناء أو أي شيء بينهما.
عندما تتعامل مع الاستثناء وتحتاج إلى المزيد من البيانات منه (بعد كل شيء هو مثيل لفئة) بدلاً من نوع الاستثناء فقط يمكنك القيام به:
محاولة
ThisFunctionMightRaiseAnException ؛
باستثناء E: استثناء dobegin
ShowMessage (E.Message) ؛
النهاية;
النهاية;
"E" في "E: Exception" هو متغير استثناء مؤقت من النوع المحدد بعد حرف العمود (في المثال أعلاه فئة الاستثناء الأساسية). باستخدام E ، يمكنك قراءة (أو كتابة) القيم إلى كائن الاستثناء ، مثل الحصول على خاصية الرسالة أو تعيينها.
من يحرر الاستثناء؟
هل لاحظت كيف أن الاستثناءات هي في الواقع أمثلة لفصل ينحدر من الاستثناء؟ تطرح الكلمة الأساسية للرفع مثيل فئة استثناء. ما تقوم بإنشائه (مثيل الاستثناء هو كائن) ، أنت أيضًا بحاجة إلى تحرير. إذا قمت (ككاتب مكتبة) بإنشاء مثيل ، فهل سيفرج عنه مستخدم التطبيق؟
هنا ال دلفي magic: معالجة استثناء تدمر الكائن الاستثناء تلقائيًا. هذا يعني أنه عند كتابة التعليمات البرمجية في كتلة "باستثناء / نهاية" ، فإنه سيصدر ذاكرة الاستثناء.
إذن ، ماذا يحدث إذا أثارت ThisFunctionMightRaiseAnException في الواقع استثناءً ولم تكن تتعامل معه (هذا ليس هو نفسه "الأكل")؟
ماذا عن عندما لا يتم التعامل مع الرقم / 0؟
عندما يتم طرح استثناء غير معالج في التعليمات البرمجية الخاصة بك ، يعالج Delphi مرة أخرى بطريقة سحرية استثناءك عن طريق عرض مربع حوار الخطأ للمستخدم. في معظم الحالات ، لن يوفر مربع الحوار هذا بيانات كافية للمستخدم (وأخيرًا أنت) لفهم سبب الاستثناء.
يتم التحكم في ذلك عن طريق حلقة رسالة دلفي عالية المستوى حيث الكل تتم معالجة الاستثناءات بواسطة كائن التطبيق العام وطريقة HandleException الخاصة به.
للتعامل مع الاستثناءات عالميًا ، ولإظهار مربع حوار سهل الاستخدام ، يمكنك كتابة التعليمات البرمجية لـ TApplicationEvents. معالج حدث OnException.
لاحظ أن كائن التطبيق العام محدد في وحدة النماذج. TApplicationEvents هو مكون يمكنك استخدامه لاعتراض أحداث كائن التطبيق العام.