لايف نت - عرض مشاركة واحدة - الاستثناءات اصطياد الأخطاء ومعالجتها رقم العضوية : 95   <font color="#0033CC">MaZeN</font> MaZeN ">

عرض مشاركة واحدة

  مشاركة رقم : 1 (permalink)  
قديم 19-08-2007, 12:42 PM
MaZeN
الصورة الرمزية MaZeN
مشرف سابق

رقم العضوية : 95
تاريخ التسجيل : Jan 2007
العمر : 23
المشاركات : 4,901
بمعدل : 6.66 يوميا
الجنس :
على النت: 1999
المؤهل الدراسي : جامعي
الجوال : Motorola L7
إرسال رسالة عبر مراسل MSN إلى MaZeN إرسال رسالة عبر مراسل Yahoo إلى MaZeN

MaZeN غير متواجد حالياً عرض البوم صور MaZeN



المنتدى : منتدى لغات البرمجة
افتراضي الاستثناءات اصطياد الأخطاء ومعالجتها

الموضوع الذي سأقوم بطرحه ربما يعرفه الكثيرين ولكن بالنسبة للمبتدئين يمكن أن يكون مفيدا ويمكنكم اعتبار الموضوع تجميع لأفكار معالجة الاستثناءات

التقاط استثناء معين
لالتقاط استثناء نستعمل بلوك Try ... Catch بشكل عام عندما ينفذ البرنامج عملية معينة قد تولد استثناء فلعمل ذلك نقوم بوشع تلك الشيفرة البرمجية بين عبارتي Try و Ctach و بعد العبارة Catch نستكشف الاستثناءات الحاصلة

كودTry
C = A + B
Catch Ex as OverflowException

ويتيح الجزء Catch للبرنامج اكتشاف استثناء معين والرد عليه فمثلا يمكننا التقاط استثناء القسمة على صفر Devided By Zero
كودTry
C = A Mod B
****Box3.**** = C.ToString()
Catch Ex as DividedByZeroException
MsgBox("Devided By Zero.")
****Box3.**** = "Infinity"
End Try

وبنفس الطريقة يمكننا استكشاف استثناء فيضان Overflow Exception
كودDim A, B, C As Integer
Try
A= ****Box1.****
B = ****Box2.****
C = A + B
Catch Ex as OverflowException
MsgBox("Overflow.")
****Box3.**** = "Infinity"
End Try
وحتى أيضا يمكننا استخدامه للكشف عن اسم ملف غير صالح
كودDim Fname As New String = "D:\Some Folder\FileName.ext"
Dim Sfl as new StreamReader
Try
Sfl = New StreamReader(Fname)
****Box1.**** = Sfl.ReadToEnd()
Sfl.Close
Catch Ex As FileNotFoundException
MsgBox("File Not Found")
End Try

فحص عدة استثناءات
عندما يمكن أن تؤدي العملية التي تقوم بتنفيذها إلى عدة استثناءات مختلفة يمكنك تحديد سلسلة من الجمل Catch لمعالجة تلك الاستثناءات
كود Dim FileDB As New OpenFileDialog()
FileDB.Filter = "All files | *.* | **** files | *.txt"
FileDB.FilterIndex = 2
FileDB.InitialDirectory = "C:\Temp"
FileDB.AddExtension = True
FileDB.Defaul**** = "txt"
' Prevent dialog box from validating file
FileDB.CheckFileExists = False
FileDB.CheckPathExists = False
If (FileDB.ShowDialog() = DialogResult.OK) Then
Dim SourceFile As StreamReader
Try
SourceFile = New StreamReader(FileDB.FileName)

****Box1.**** = SourceFile.ReadToEnd()

SourceFile.Close()
Catch Except As DirectoryNotFoundException
MsgBox("Error: " & Except.Message)
Catch Except As FileNotFoundException
MsgBox("Error: " & Except.Message)
Catch Except As Exception
MsgBox("Error: " & Except.Message)
End Try
Else
MsgBox("User selected Cancel")
End If

معالجة الاستثناءات باستعمال بلوك Catch عام
عندما ينفذ كائن عملية نيابة عن البرنامج فقد يولد نطاقا واسعا من الاستثناءات بناء على سير تنفيذ البرنامج وقد لاتهمك ما هي هذه الاستثناءات بقدر ما يهمك أنه قد حصل هناك استثناء ما ولمعالجة الاستثناءات بغض النظر عن نوعها فإننا لا نحدد استثناء معينا بل نستخدم
كودCatch Ex as Exception
مثال
كودTry

..... Some Code Here

Catch Ex As Exception
MsgBox("Error: " & Ex.Message)
End Try

إجراء التظيف بعد حدوث استثناء

عند استعمالك لبلوك Try ... Catch للرد على سلسلة من الاستثناءات ستنفذ عادة عمليات تخص كل استثناء ضمن بلوك Catch المناسب وبناء على الأمور التي يقوم بها برنامجك عليك القيام بعميات معينة بعد حدوث استثناء وذلك بغض النظر عن نوع الاستثناء ولهذا الغرض نستخدم عبارة Finally في نهاية بلوك Try ... Catch تحدد الجمل التي نريد تنفيذها بغض النظر عن نوع الاستثناء مع ملاحظة أن العبارات الموجودة ضمن بلوك Finally سيتم تنفيذها دوما بغض النظر عن حدوث استثناء أو لا
كود Dim FileDB As New OpenFileDialog()

FileDB.Filter = "All files | *.* | **** files | *.txt"

FileDB.FilterIndex = 2
FileDB.InitialDirectory = "C:\Temp"
FileDB.AddExtension = True
FileDB.Defaul**** = "txt"

' Prevent dialog box from validating file
FileDB.CheckFileExists = False
FileDB.CheckPathExists = False

If (FileDB.ShowDialog() = DialogResult.OK) Then
Dim SourceFile As StreamReader

Try
SourceFile = New StreamReader(FileDB.FileName)
Catch Except As Exception
MsgBox("Error: " & Except.Message)
End Try

If (Not SourceFile Is Nothing) Then
Try
****Box1.**** = SourceFile.ReadToEnd()
Catch Except As Exception
MsgBox("Error: " & Except.Message)
Finally
MsgBox("In finally statements")
SourceFile.Close()
End Try
End If
Else
MsgBox("User selected Cancel")
End If

وفي بعض الحالات قد تكون هناك أوقات لاتريد استكمال تنفيذ البلوك Try ... Catch عندها تستخدم العبارة Exit Try للخروج من البلوك حيث سينفذ بعدها أول سطر كود يلي End Try
كودTry

.... Some Code

If SomeCondition Then Exit Try

Catch Ex as Exception

Exit Try

.... Rest of Try Block

إطلاق استثناءاتك الخاصة
هناك أوقات تحتاج فيها لتكوين استثناء خاص بك عندها ستحتاج بكل بساطة لإنشاء فئة Class ترث الفئة Exception - راجع دروس الوراثة في المنتدى - فعلى سبيل المثال يمكننا توليد استثناء باسم InvalidEMailException كما يلي
كودPublic Class InvalidEMailException
Inherits System.Exception

Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub
End Class
و بالطبع يمكنك انشاء طرق وخصائص في هذه الفئة حسب احتياجاتك كأي فئة أخرى وفي مثالنا المبسط هنا أنشأنا مشيد الفئة فقط وبعد إنشاء فئة الاستثناء الخاصة بنا يمكننا توليد الاستثناء باستخدام العبارة Throw
كودThrow New InvalidEMailException("Envalid Email Please Correct")
وفيما يلي مثال آخر
كودPublic Class MyException
Inherits System.Exception

Sub New(ByVal Message As String)
MyBase.New(Message)
End Sub
End Class

Public Class Form1
Inherits System.Windows.Forms.Form

.....

Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Try
MsgBox("About to generate custom exception")
Throw (New MyException("** Custom Message **"))
Catch Ex As MyException
MsgBox("Custom Exception thrown " & Ex.Message)
End Try

End Sub

......

End Class


توقيع MaZeN




رد مع اقتباس