الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

اصطياد الأخطاء دون الحاجة إلى Try..Catch

مغلق
بدأه حمزة في 28 أكتوبر 2005 · 10 رد · 1,895 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الجميع يقوم بكتابة البرامج والجميع يقع في الأخطاء

كم مرة كتبت برنامج وسهرت الليالي وانت تحاول تقليل نسبة الأخطاء في البرنامج,

من منا لا يذكر الـ VB 6.0 وجملته الشهيرة " Run – Time Error "

مرات ومرات تقف هذه الجملة في وجهك, تكتب الكود وتحاول تفاديها وكأنها عدوك اللدود.

وفي النهاية ينتهي البرنامج وتكتمل الفرحة وتقوم لتخبر صديقك وتريه البرنامج, وفجأة ...

"Run – Time Error"ويقفل البرنامج,

تسودّ الدنيا ونبدأ لعبة القط والفأر من جديد, أين حصل الخطأ وما السبب ؟؟؟!!!

أتت تقنية الـ .NET لتريحنا من جملة الـ VB 6.0 فلم نعد نراها, بل ما نراه هو شرح الخطأ,

والأجمل أن البرنامج لا يقفل وهذا ما يريح نفسية المستخدم إلى حد كبير.

خلال السنوات الثلاث الأخيرة لاحظت ان أغلب المبرمجين يحاولون اصطياد الاخطاء

من خلال (Try...Catch…End Catch) في الإجراءات

التي يتوقعون حدوث اخطاء فيها, ويتركون تلك التي ليست ذات أهمية عالية, واغلب هؤلاء

لا يقومون بمعالجة الخطأ او اظهار رسالة تخبر المستخدم بحودث خطأ.

هذه المقدمة كانت للفت نظر الأخوة الأعزاء الى ضرورة الانتباه الى ان اصطياد الاخطاء

مسألة مهمة, وهنا سأقدم الطريقة التي استخدمها منذ فترة ليست بالقصيرة,

وهي التي تسمح باصطياد جميع اخطاء البرنامج من خلال إجراء واحد فقط, فلم تعد بحاجة

إلى كتابة جملة Try…Catch هنا وهناك – إلى حد ما –

إجعل برنامجك يبدأ بالتنفيذ من Sub Main واكتب هذا الكود في الـ Module:

Imports System.Threading

Module mdlMain
    Public Sub Main()
        Dim frm As New frmMain

        AddHandler Application.ThreadException, New ThreadExceptionEventHandler(AddressOf GlobalErrorProc)

        Application.Run(frm)

    End Sub

    Public Sub GlobalErrorProc(ByVal sender As Object, ByVal args As ThreadExceptionEventArgs)

        MessageBox.Show("An unhandled exception has occured: " & args.Exception.Message, _
                "Unhandled Exception", MessageBoxButtons.OK, MessageBoxIcon.Error)

    End Sub

End Module

هكذا إذا حصل أي خطأ سيظهر رسالة للمستخدم. تخبره نوع الخطأ وتعلمك

بالسطر الذي حدث فيه الخطأ وضمن أي إجراء – أي بالتفصيل الممل-.

في المثال المرفق قمت بتنسيق الرسالة التي تظهر للمستخدم, يمكن لكل شخص تعديلها

حسب رغبته, ولكن تجدر الإشارة هنا الى انه يجب تسجيل هذه الاخطاء في ملف على القرص

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

هذا ما أعرفه إن شاء الله يستفيد منه الأخوة الكرام

إذا كان أحد الأخوة لديه فكرة أو طريقة ثانية يا ريت ينورنا بها

Program Error Handler.rar

اقتباس
How to get experience without a job, and how to get a job without experience
#2

طريقة جيدة وجديدة اخى الفاضل ساجربها واقول لك على رأيي

بصراحة انا كنت بكبر دماغى وبحط On Error Resume Next

صحيح مكنش بيحصل خطأ لكن كانت بتحصل كوارث فى قاعدة البيانات

هجرب واقولك على النتيجة

الايمان +الحلم +العلم +العمل = النجاح

ما اسهل ان تنجح ... وما اصعب ان تحافظ على نجاحك

#3

فعلا شيء رائع..يختصر مئات الأشطر في البرامج الضخمة..

تخيلوا لو استعملوا Try Catch في برنامج مثل 3DS MAX

:lol:

#4

كان 25% من الكود Try..Catch..End Try :D :o :D

اقتباس
How to get experience without a job, and how to get a job without experience
#5

إذا كان المقصود من هذه العملية (بلع) الأخطاء، وإذا كنت فهمت الموضوع جيدا،، فهذه الدعوة إلى اتخاذ هذا الأسلوب قد يكون من أسوأ النصائح التصميمة في برنامجك!

إذا اضطررت إلى هذا الأسلوب، فهذا يعني إما:

1- برنامجك ليس قائما على البرمجة الشيئية التوجه. وهذا يعني أن البرنامج لم يستفد استفادة حقيقية من بيئة .Net، وكان من الأفضل برمجة البرنامج ب VB!

2- الدوال التي يعتمد عليها برنامجك عجيبة، ولا تعرف ماذا تفعل دالة معينة صنعتها بنفسك. وهذا أمر غريب.

3- تستعمل دوالا غير مشروحة وغير واضحة الاستعمال، أو دوالا لا تخبرك بنوع الأخطاء التي قد تنتج لك! أو بمعني آخر، شرح دوال مكتبة net غير واضحة!

4- ربما أمر آخر عجيب!

ربما يكون جزء من المشكلة عدم وجود checked exceptions في بيئة net أو الأخطاء المدققة مسبقا، مما يجعل المطور نسيان ذكر ما يمكن أن ينتج من مناداة دالة معينة.

أضيف أن هذه الطريقة قد تكون مجدية في حال انتهيت من برنامجك بشكل كامل، ودققت أنواع الأخطاء المتوقعة وصنعت محاولات الاصطياد try-catch مناسبة في عدة أماكن من شفرتك، بعد هذا (وعند توزيع البرنامج، وبعد الانتهاء من البرنامج كاملا) اصنع الطريقة التي وضعها أخي حمزة،، حتى تصطاد ما لم تكن تتوقعه أبدا أن يحدث، وبعدها اكتب هذا الخطأ في سجل الأخطاء.. هذه الطريقة هدفها فقط تسجيل الأخطاء حتى يتسنى لك بعدها أن تأخذ الأخطاء الجديدة العجيبة التي لم تكن تتوقع حدوثها وترجع إلى شفرة البرنامج وتضع try-catch مناسبة وتنتج الإصدار 1.1 الذي في تنقيح بسيط! وهكذا..

مع تمنياتي لكم برمجة بتصاميم سعيدة، خالية من الأخطاء.

بالتوفيق!

#6

السلام عليكم

حياكم الله جميعاً, وتشكر أخي على هذا الموضوع المهم جداً, أنا مع الاخ الخبير أبومازن والكلام الذي أدلى به هو عين الصواب,

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

فلا يمكن أن نعتمد عليه بشكل مباشر, ولا يمكن كذلك الاستغناء عنه, إلا أنني أختلف مع أبومازن من حيث تركه إطلاقاً إذا كان يقصد ذلك,

فهذا الحدث لابد أن يلازم المشروع,

السبب في ذلك كما ذكر كتاب Gotachas في الدرس السادس GOTCHA #6 Exceptions may go unhandled

أولاً يمكن بالحدث العام للأخطاء تفادي ما تم نسيانه أو مشكلة غير متوقعه ,

على قول المثال الشائع بين المبرمجين أن المستخدم هو الوحيد القادر على كشف اخطاء البرامج.

Software bugs are impossible to detect by anybody except the end user

ميكانيكية هذه التقنية أنها تجعل الـ CLR يتنبه للسلوكيات و الاحداث في البرنامج , فإن حدث أي شيء غير متوقع يقوم هذا الحدث

بإصطياده و عرضه على المستخدم بالشكل الذي يحدده المبرمج.

وكذلك لا يمكن الاعتماد عليه لأسباب منها , كما ذكر لكم خبيرنا عن منطق كائنية التوجه, وعدم جعل البرنامج على الطريقة الاسبجتية.

ومنها كذلك ما يعرف بـ Lost exception in asynchronous call سواءً في التوقيت Timer أو اي عنصر من نوع Thread

حيث يتطلب منا إستخدام Try Catch Finally كما هو مشار لها في الدرس GOTCHA #61 Exceptions thrown from threads in the pool are lost .

خلاصة القول أن وجودها مطلوب, و الاعتماد عليها بشكل كلي مرفوض.

هذا والله أعلم.

في المثال يتضح المقال

#8
اقتباس
أن هذه الطريقة قد تكون مجدية في حال انتهيت من برنامجك بشكل كامل، ودققت أنواع الأخطاء المتوقعة وصنعت محاولات الاصطياد try-catch مناسبة في عدة أماكن من شفرتك، بعد هذا (وعند توزيع البرنامج، وبعد الانتهاء من البرنامج كاملا) اصنع الطريقة التي وضعها أخي حمزة،، حتى تصطاد ما لم تكن تتوقعه أبدا أن يحدث، وبعدها اكتب هذا الخطأ في سجل الأخطاء.. هذه الطريقة هدفها فقط تسجيل الأخطاء حتى يتسنى لك بعدها أن تأخذ الأخطاء الجديدة العجيبة التي لم تكن تتوقع حدوثها وترجع إلى شفرة البرنامج وتضع try-catch مناسبة وتنتج الإصدار 1.1 الذي في تنقيح بسيط! وهكذا..

كنت سأرد نفس رد الخبير أبو مازن والذي أراحني من كتابته

والاخ العزيز الغملاسي .. واضح في رد أبو مازن أنه لم يقصد ترك الطريقة بالكلية..

فلسطين الزاهية بألوان الحب والسلام

ذلك الطعم الزيتوني الذي يتدفق عسلاً من أفواه بساتينها وحدائقها

تشتاق إليها نفوس المتقين وترنوا للسجود فيها جباه المسلمين

#9

نشكركم جميعاً

#10

الطريقة المقترحة من قبل الأخ حمزة لا تعالج أي خطأ

فقط تظهر رسالة و بهذا فهي لا تكون أفضل من ال Try لأن ال Try تعمل على تنفيذ الأوامر المكتوبة + تصيد الأخطاء + أنهاء ال Block بشكل سليم

و لو كان على الرسالة فأن السطر التالي يأدي الغرض

if Err.Number <>0 then Msgbox Err.Description

و سلامتكم

وفوق كل ذي علم عليم

http://www.leaderstechnology.com

-------------------------------

#11

الا تعتقد ان مثل هذه الدالة قد تكشف بعض اسرار البرنامج للمستخدمين السيئين (الهكر)؟؟

<span style='color:green'>سؤل ابن عباس عن علمه كيف جمعه فقال :( أوتيت لسانا سؤولا وقلبا عقولا)</span>

هذا الموضوع مغلق.

مواضيع مشابهة