- tarik
- عدد المساهمات : 134
تاريخ التسجيل : 08/10/2012
معالجة الاخطاء vb.net
الأحد أكتوبر 14, 2012 3:10 pm
متى نستخدم معالجات الأخطاء
يمكنك استخدام معالجات الأخطاء في أي وضع يولد احتمال لحدوث خطأ يوقف تنفيذ البرنامج سواء كان ذلك الخطأ متوقعا أم غير متوقع. وبشكل عام تستخدم معالجات الأخطاء لإدارة أحداث خارجية قد تؤثر على مسار تنفيذ البرنامج كفشل في الوصول للشبكة أو قرص مضغوط غير موجود أو طابعة أو ماسح ضوئي غير مشغلين مثلا ومن هذه المشاكل المحتملة التي تحتاج إلى معالجات أخطاء:
• شبكة/انترنت مشكلة في المخدمات أو تجهيزات الاتصال
• قواعد بيانات عدم القدرة على إنشاء اتصال أو تنفيذ استعلام أو أن قاعدة البيانات تعيد خطأ ما
• سواقات الأقراص قرص غير مهيأ أو مهيأ بصورة غير صحيحة أو قرص قابل للإزالة غير مدخل بشكل جيد
أو قطاعات تالفة أو حتى قرص ملئ
• مشاكل المسارات مسار خاطئ أو غير صحيح
• مشاكل الطابعة طابعة مطفأة أو بدون ورق أو غير متوفرة لسبب ما
• مشاكل برمجيات مكونات أو مكتبات يعتمد عليها ملف للتنفيذ ناقصة أو غير منصبة بصورة صحيحة أو
وجود تعارض أو عدم توافقية بين بعض المكتبات
• مشاكل أمان البرنامج يحاول القيام بعملية غير مسموحة أو أن المستخدم الذي يشغل البرنامج لا يمتلك
الصلاحيات الكافية لإتمام تنفيذ العملية
• مشاكل ذاكرة مصادر نظام غير كافية
• مشاكل الحافظة مشاكل في تبادل البيانات مع حافظة ويندوز
• مشاكل منطقية مشاكل صيغة أو مشاكل منطقية لم يستطع المترجم كشفها
كتلة Try … Catch
كتلة الكود التي تستخدم لمعالجة أخطاء زمن التنفيذ تدعى Try … Catch حيث يمكنك كتابة عبارة Try ضمن إجراء معالجة الحدث قبل الكود الذي تتوقع أن يولد مشكلة وتليها مباشرة عبارة Catch فإن حدث خطأ في زمن التنفيذ فيتم تنفيذ مجموعة من العبارات ضمن كتلة Catch ثم ستنفذ مجموعة من العبارات الاختيارية في كتلة Finally كما يمكن في بعض الحالات تعشيش عدة بلوكات Try … Catch داخل بعضها و تكون الصيغة العامة لكتلة Try … Catch
فمثلا إن حاولنا فتح ملف صورة وتحميله في صندوق الصورة يمكننا وضع ذلك الكود ضمن كتلة Try … Catch وذلك لحماية البرنامج من الأخطاء التي قد تحدث في زمن التنفيذ
من الأغراض الموروثة المفيدة الباقية من نسخ فيجول بايزيك السابقة الغرض Err بنسخته المحدثة بمعلومات مفصلة لمعالجة الأخطاء لكل خطأ زمن تنفيذ يحدث في البرنامج ومع ذلك هناك طرق أحدث لإدارة الأخطاء في الفريموورك مثل الغرض Exception القوي وتشكل الخصائص Err.Number و Err.Description الخصائص الأكثر إفادة لتحديد أخطاء زمن التنفيذ فالخاصية Err.Number تحتوي على رقم الخطأ الخاص بآخر خطأ زمن تنفيذ حدث مؤخرا والخاصية Err.Description تحتوي على رسالة قصيرة تطابق رقم الخطأ الذي حدث مؤخرا وتلك الخاصيتان تمكناك من التعرف على الأخطاء التي حدثت مؤخرا وتحديد الاستجابة المناسبة لها وقد تعطي المستخدم رسالة عن كيف يمكن أن يتصرف في حالة حدوث خطأ معين كما يمكنك تفريغ الخطأ بواسطة الطريقة Err.Clear ولكن إن استخدمت الغرض Err داخل كتلة Catch فيصبح من غير الضروري تفريغ الخطأ لأنه لا يتم الدخول إلى كتلة Catch إلا إن حدث خطأ
والمثال التالي يتعرف على عدة أخطاء زمن التنفيذ باستخدام الغرض Err
وهي تستخدم للخروج من كتلة Try … Catch بشكل مشابه للعبارات Exit For و Exit Sub المألوفة حيث باستخدامها تخرج كليا من كتلة Try ولكن إن كان قسم Finally موجودا فسيتم تنفيذه ولكن عبارة Exit Try تجعلك تقفز فوق بقية عبارات Try … Catch الباقية
استخدام معالجات الأخطاء ليست الطريقة الوحيدة لحماية برنامجك من حدوث أخطاء زمن التنفيذ فقطعة الكود التالية تستخدم الطريقة File.Exists في مجال الأسماء System.IO في مكتبة فئات الفريموورك للتأكد من أن الملف موجود فعلا قبل محاولة فتحه
وهنا يظهر لدينا سؤال: متى يجب علينا استخدام طريقة البرمجة الدفاعية ومتى يجب علينا استخدام معالجات الأخطاء؟ ويكون الجواب هو أنه يجب عليك استخدام مزيج من الطريقتين في كودك حيث تكون طريقة البرمجة الدفاعية هي الأكثر فعالية لمعالجة المشاكل المحتملة. وكما ذكرنا سابقا فالطريقة File.Exists أسرع من بلوك Try … Catch لمعالجة الأخطاء لذا فمن المنطقي استخدام تقنية البرمجة الدفاعية من أجل الأخطاء التي تتوقع حدوثها بشكل متكرر واستخدام التراكيب الخاصة بمعالجة الأخطاء إذا كان لديك أكثر من شرط لفحصه وتريد تزويد مستخدم برنامجك بعدد من الخيارات كاستجابة لذلك الخطأ كما تمكنك من معالجة الأخطاء التي قد لا تتوقعها.
يمكنك استخدام معالجات الأخطاء في أي وضع يولد احتمال لحدوث خطأ يوقف تنفيذ البرنامج سواء كان ذلك الخطأ متوقعا أم غير متوقع. وبشكل عام تستخدم معالجات الأخطاء لإدارة أحداث خارجية قد تؤثر على مسار تنفيذ البرنامج كفشل في الوصول للشبكة أو قرص مضغوط غير موجود أو طابعة أو ماسح ضوئي غير مشغلين مثلا ومن هذه المشاكل المحتملة التي تحتاج إلى معالجات أخطاء:
• شبكة/انترنت مشكلة في المخدمات أو تجهيزات الاتصال
• قواعد بيانات عدم القدرة على إنشاء اتصال أو تنفيذ استعلام أو أن قاعدة البيانات تعيد خطأ ما
• سواقات الأقراص قرص غير مهيأ أو مهيأ بصورة غير صحيحة أو قرص قابل للإزالة غير مدخل بشكل جيد
أو قطاعات تالفة أو حتى قرص ملئ
• مشاكل المسارات مسار خاطئ أو غير صحيح
• مشاكل الطابعة طابعة مطفأة أو بدون ورق أو غير متوفرة لسبب ما
• مشاكل برمجيات مكونات أو مكتبات يعتمد عليها ملف للتنفيذ ناقصة أو غير منصبة بصورة صحيحة أو
وجود تعارض أو عدم توافقية بين بعض المكتبات
• مشاكل أمان البرنامج يحاول القيام بعملية غير مسموحة أو أن المستخدم الذي يشغل البرنامج لا يمتلك
الصلاحيات الكافية لإتمام تنفيذ العملية
• مشاكل ذاكرة مصادر نظام غير كافية
• مشاكل الحافظة مشاكل في تبادل البيانات مع حافظة ويندوز
• مشاكل منطقية مشاكل صيغة أو مشاكل منطقية لم يستطع المترجم كشفها
كتلة Try … Catch
كتلة الكود التي تستخدم لمعالجة أخطاء زمن التنفيذ تدعى Try … Catch حيث يمكنك كتابة عبارة Try ضمن إجراء معالجة الحدث قبل الكود الذي تتوقع أن يولد مشكلة وتليها مباشرة عبارة Catch فإن حدث خطأ في زمن التنفيذ فيتم تنفيذ مجموعة من العبارات ضمن كتلة Catch ثم ستنفذ مجموعة من العبارات الاختيارية في كتلة Finally كما يمكن في بعض الحالات تعشيش عدة بلوكات Try … Catch داخل بعضها و تكون الصيغة العامة لكتلة Try … Catch
- الكود:
Try
Statements that might produce a run-time error
العبارات الممكن أن تولد خطأ
Catch
Statements to run if a run-time error occurs
العبارات التي تنفذ في حالة حدوث خطأ
Finally
Optional statements to run whether an error occurs or not
عبارات اختيارية ستنفذ إن حدث خطأ أم لا
End Try
فمثلا إن حاولنا فتح ملف صورة وتحميله في صندوق الصورة يمكننا وضع ذلك الكود ضمن كتلة Try … Catch وذلك لحماية البرنامج من الأخطاء التي قد تحدث في زمن التنفيذ
- الكود:
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch
MsgBox("Please insert the disk in drive D")
End Try
- الكود:
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch
MsgBox("Please insert the disk in drive D, Then Click Ok")
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch
MsgBox("File Load feature disabled")
End Try
End Try
من الأغراض الموروثة المفيدة الباقية من نسخ فيجول بايزيك السابقة الغرض Err بنسخته المحدثة بمعلومات مفصلة لمعالجة الأخطاء لكل خطأ زمن تنفيذ يحدث في البرنامج ومع ذلك هناك طرق أحدث لإدارة الأخطاء في الفريموورك مثل الغرض Exception القوي وتشكل الخصائص Err.Number و Err.Description الخصائص الأكثر إفادة لتحديد أخطاء زمن التنفيذ فالخاصية Err.Number تحتوي على رقم الخطأ الخاص بآخر خطأ زمن تنفيذ حدث مؤخرا والخاصية Err.Description تحتوي على رسالة قصيرة تطابق رقم الخطأ الذي حدث مؤخرا وتلك الخاصيتان تمكناك من التعرف على الأخطاء التي حدثت مؤخرا وتحديد الاستجابة المناسبة لها وقد تعطي المستخدم رسالة عن كيف يمكن أن يتصرف في حالة حدوث خطأ معين كما يمكنك تفريغ الخطأ بواسطة الطريقة Err.Clear ولكن إن استخدمت الغرض Err داخل كتلة Catch فيصبح من غير الضروري تفريغ الخطأ لأنه لا يتم الدخول إلى كتلة Catch إلا إن حدث خطأ
والمثال التالي يتعرف على عدة أخطاء زمن التنفيذ باستخدام الغرض Err
- الكود:
Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\FileOpen.bmp")
Catch When Err.Number = 53 'If File Not Found Error
MsgBox("Check pathname and disk drive")
Catch When Err.Number = 7 'If File Out Of Memory Error
MsgBox("Is this really a bitmap", , Err.Description)
Catch
MsgBox("Problem loading file", , Err.Description)
End Try
وهي تستخدم للخروج من كتلة Try … Catch بشكل مشابه للعبارات Exit For و Exit Sub المألوفة حيث باستخدامها تخرج كليا من كتلة Try ولكن إن كان قسم Finally موجودا فسيتم تنفيذه ولكن عبارة Exit Try تجعلك تقفز فوق بقية عبارات Try … Catch الباقية
- الكود:
Try
If PictureBox1.Enabled = False Then Exit Try
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\fileopen.bmp")
Catch
Retries +=1
If Retries <= 2 Then
MsgBox("Please insert the disc in drive D")
Else
MsgBox("File Load feature disabled")
Button1.Enabled = False
End If
End Try
استخدام معالجات الأخطاء ليست الطريقة الوحيدة لحماية برنامجك من حدوث أخطاء زمن التنفيذ فقطعة الكود التالية تستخدم الطريقة File.Exists في مجال الأسماء System.IO في مكتبة فئات الفريموورك للتأكد من أن الملف موجود فعلا قبل محاولة فتحه
- الكود:
If file.Exists("D:\fileopen.bmp") Then
PictureBox1.Image = _
System.Drawing.Bitmap.FromFile("D:\fileopen.bmp")
Else
MsgBox("Cannot find fileopen.bmp on drive D.")
End If
وهنا يظهر لدينا سؤال: متى يجب علينا استخدام طريقة البرمجة الدفاعية ومتى يجب علينا استخدام معالجات الأخطاء؟ ويكون الجواب هو أنه يجب عليك استخدام مزيج من الطريقتين في كودك حيث تكون طريقة البرمجة الدفاعية هي الأكثر فعالية لمعالجة المشاكل المحتملة. وكما ذكرنا سابقا فالطريقة File.Exists أسرع من بلوك Try … Catch لمعالجة الأخطاء لذا فمن المنطقي استخدام تقنية البرمجة الدفاعية من أجل الأخطاء التي تتوقع حدوثها بشكل متكرر واستخدام التراكيب الخاصة بمعالجة الأخطاء إذا كان لديك أكثر من شرط لفحصه وتريد تزويد مستخدم برنامجك بعدد من الخيارات كاستجابة لذلك الخطأ كما تمكنك من معالجة الأخطاء التي قد لا تتوقعها.
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى