تاريخ التحديث: رقم 2
وقت التحديث: 2001-10-21 02:42
تم التحديث بواسطة: Musicwind®
ملاحظة التحديث: التنسيق المعدل.
تاريخ التحديث: رقم 1
وقت التحديث: 2001-10-19 21:15
تم التحديث بواسطة: Musicwind®
ملاحظات التحديث: تم الإنشاء.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~~~~~~~~~~~~~~
مقدمة: لقد كنت منغمسًا في دلفي لأكثر من ثلاث سنوات، ولكن في كل مرة أقرأ فيها وثائق مساعدة دلفي، ما زلت أكسب الكثير، لذلك لا يسعني إلا أن أتنهد بمدى اتساع دلفي! بينما أشعر بالخجل، سأقوم بفرز بعض تجاربي ومكاسبي، وسأشارك تشجيعي مع أولئك منكم المتغطرسين والأقل معرفة مثلي.
1. ما هو الاستثناء الصامت؟ (لماذا لا صمت الحملان؟ ;- ))
تشير الاستثناءات الصامتة، أي الاستثناءات الصامتة ، إلى نوع الاستثناء الذي لا يسبب مطالبات رسائل مزعجة بشكل افتراضي: EAbort . في Object Pascal، فئة الاستثناء EAbort هي الفئة الأصلية لجميع فئات الاستثناء الصامت (ويرث EAbort الاستثناء). سيؤدي رفع EAbort إلى توقف وحدة التنفيذ حتى تعترضها وحدة معالجة الاستثناءات الخارجية، ولكن لن يتسبب في ظهور مربع رسالة بعلامة توقف حمراء. الرجوع إلى الكود التالي:
يحاول
ShowMessage('Hello1');
رفع EAbort.Create('إحباطه');
ShowMessage('Hello2');
يستثني
على E: استثناء القيام
showmessage('في حالة الاستثناء');
نهاية؛
تعرض نتيجة التنفيذ مربعي رسائل، أحدهما "Hello1" والآخر "On Exception". يوضح هذا أن EAbort يعمل، لأنه يتخطى عبارة "ShowMessage('Hello2')" في نفس الوقت، ولا يظهر مربع الرسالة "Abort it"، مما يؤكد أيضًا ميزة فئة استثناء EAbort التي لا يوجد بها مربع حوار. يظهر مربع (وهذا صحيح أيضًا أثناء التصميم)؛ ويشير مربع الرسالة "عند الاستثناء" إلى أنه على الرغم من أن EAbort قد يكون شذوذًا مختلفًا عن الاستثناءات العادية، فإن هذا لا يمنعنا من استخدام عبارة Try-Except القديمة لاكتشافه. .
2. لماذا نستخدم إيبورت ؟
يعد EAbort مفيدًا في مواقف معينة. على سبيل المثال، عندما نحتاج إلى إنهاء عملية ما ولكننا لا نريد أن يلاحظها المستخدمون (لا نريدهم أن يروا مربع رسالة الاستثناء الافتراضي). بالطبع، لتحقيق نفس التأثير، يمكنك أيضًا استخدام الاستثناءات العادية (على سبيل المثال، استخدم نمط جملة Try-Except، ووضع الكود في قسم Try، ورفع استثناء إذا كنت بحاجة إلى إنهاء العملية، ولا تكتب أي رمز في القسم باستثناء)، ولكن لا شيء من هذا بسيط ومباشر مثل استخدام EAbort.
3. هل هناك أي شيء أبسط؟ --استخدام عملية الإجهاض
Abort، وهي عملية محددة في وحدة SysUtils، تسمح لنا باستخدام EAbort بسهولة. عرض الكود المصدري لتطبيق Abort:
إحباط الإجراء؛
وظيفة ReturnAddr: المؤشر؛
asm
موف إياكس، [إب + 4]
نهاية؛
يبدأ
رفع EAbort.Create(SOperationAborted) في ReturnAddr؛
نهاية؛
SOperationAborted هنا عادة ما يكون "تم إحباط العملية".
4. رفع الحجاب – مبدأ التنفيذ
ربما أنت، مثلي، تشعر بالفضول لمعرفة سبب صمت EAbort. ما الذي فعلته شركة دلفي لـ EAbort داخليًا؟ دعونا نكتشف ذلك معًا.
افتح مشروعًا جديدًا، وانقر فوق "بحث في الملفات"، وأدخل الكلمة الأساسية "EAbort"، ثم حدد زر الاختيار "بحث في الدلائل"، وقم بتعيين مربع تحرير "قناع الملف" في "خيارات دليل البحث" على اسم الدليل حيث يوجد كود مصدر دلفي (مثل مثل نعم: D:Program FilesBorlandDelphi6Source)، ولا تنس التحقق من تضمين الدليل الفرعي. وأخيرا، انقر فوق "موافق" لبدء البحث.
ونتيجة لذلك، وجدنا أن هناك ما يصل إلى 17 مكانًا في كود مصدر دلفي المرتبطة بـ EAbort. باستثناء إعلاني EAbort وبعض عبارات التعليق في وحدة Sysutils، وجدنا أن معظم التعليمات البرمجية مشابهة لما يلي:
إذا كان ExceptObject هو EAbort إذن
إلى جانب:
إذا لم يكن (E هو EAbort) ثم
إلخ.
يتمتع كل منهم بمعاملة خاصة لـ EAbort استنادًا إلى RTTI - وتبين أن تنفيذ EAbort بهذه البساطة!
الوحدتان الجديرتان بالاهتمام هما: النماذج (إصدار Linux هو QForms) وAppEvnts. من الأسهل العثور على إجابة السؤال في الكود السابق. راجع كود مصدر دلفي:
إجراء Tapplication.HandleException(Sender: TObject);
يبدأ
إذا كان GetCapture <> 0 ثم SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
إذا كان ExceptObject هو استثناء إذن
يبدأ
إذا لم يكن الأمر كذلك (ExceptObject هو EAbort) إذن
إذا تم تعيينه (FOnException) بعد ذلك
FOnException(المرسل، الاستثناء(ExceptObject))
آخر
ShowException(Exception(ExceptObject));
نهاية آخر
SysUtils.ShowException(ExceptObject, ExceptAddr);
نهاية؛
5. الفرق بين الإجهاض والكسر والخروج
إن Abort وBreak وExit متشابهة إلى حد ما، ولكنها مختلفة تمامًا. يتم استخدام Break للخروج من حلقة في بيان حلقة. يتم استخدام الخروج للانتقال من نص الوظيفة المنفذة حاليًا (أو نص العملية). يتيح لك الإجهاض القفز من طبقة واحدة أو أكثر من التعليمات البرمجية حتى يلتقطها استثناء رمز الالتقاط.
6. تخصيص الاستثناءات الصامتة
تمامًا مثل الإعلان عن فئة فرعية لفئة استثناء عادية، ما عليك سوى جعل EAbort وفئاتها الفرعية فئات أسلاف:
TMyException = Class(EAbort);
TNextException = Class(EAbort);
إلخ.
Musicwind®@HangZhou.Zhejiang.China
2001-10-20
المزيد من المقالات
[ نهاية المقال ]