الاستثناءات Exceptions اصطياد الأخطاء ومعالجتها - RaggiTech - 02-10-12
كاتب الموضوع : samerselo
الاستثناءات Exceptions اصطياد الأخطاء ومعالجتها
التقاط استثناء معين
لالتقاط استثناء نستعمل بلوك Try ... Catch بشكل عام عندما ينفذ البرنامج عملية معينة قد تولد استثناء فلعمل ذلك نقوم بوشع تلك الشيفرة البرمجية بين عبارتي Try و Ctach و بعد العبارة Catch نستكشف الاستثناءات الحاصلة
كود :
Try
C = A + B
Catch Ex as OverflowException
ويتيح الجزء Catch للبرنامج اكتشاف استثناء معين والرد عليه فمثلا يمكننا التقاط استثناء القسمة على صفر Devided By Zero
كود :
Try
C = A Mod B
TextBox3.Text = C.ToString()
Catch Ex as DividedByZeroException
MsgBox("Devided By Zero.")
TextBox3.Text = "Infinity"
End Try
وبنفس الطريقة يمكننا استكشاف استثناء فيضان Overflow Exception
كود :
Dim A, B, C As Integer
Try
A= TextBox1.text
B = TextBox2.Text
C = A + B
Catch Ex as OverflowException
MsgBox("Overflow.")
TextBox3.Text = "Infinity"
End Try
وحتى أيضا يمكننا استخدامه للكشف عن اسم ملف غير صالح
كود :
Dim Fname As New String = "D:\Some Folder\FileName.ext"
Dim Sfl as new StreamReader
Try
Sfl = New StreamReader(Fname)
TextBox1.Text = Sfl.ReadToEnd()
Sfl.Close
Catch Ex As FileNotFoundException
MsgBox("File Not Found")
End Try
فحص عدة استثناءات
عندما يمكن أن تؤدي العملية التي تقوم بتنفيذها إلى عدة استثناءات مختلفة يمكنك تحديد سلسلة من الجمل Catch لمعالجة تلك الاستثناءات
كود :
Dim FileDB As New OpenFileDialog()
FileDB.Filter = "All files | *.* | Text files | *.txt"
FileDB.FilterIndex = 2
FileDB.InitialDirectory = "C:\Temp"
FileDB.AddExtension = True
FileDB.DefaultExt = "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)
TextBox1.Text = 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 | *.* | Text files | *.txt"
FileDB.FilterIndex = 2
FileDB.InitialDirectory = "C:\Temp"
FileDB.AddExtension = True
FileDB.DefaultExt = "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
TextBox1.Text = 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
الاستثناءات Exceptions اصطياد الأخطاء ومعالجتها - RaggiTech - 02-10-12
مرفق ملف يحتوي قائمة ببعض فئات الأخطاء وتوضيح بسيط لكل منها
|