02-10-12, 09:31 AM
كاتب الموضوع : samerselo
الاستثناءات Exceptions اصطياد الأخطاء ومعالجتها
التقاط استثناء معين
لالتقاط استثناء نستعمل بلوك Try ... Catch بشكل عام عندما ينفذ البرنامج عملية معينة قد تولد استثناء فلعمل ذلك نقوم بوشع تلك الشيفرة البرمجية بين عبارتي Try و Ctach و بعد العبارة Catch نستكشف الاستثناءات الحاصلة
كود :
Try
C = A + B
Catch Ex as OverflowException
كود :
Try
C = A Mod B
TextBox3.Text = C.ToString()
Catch Ex as DividedByZeroException
MsgBox("Devided By Zero.")
TextBox3.Text = "Infinity"
End Try
كود :
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 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
.... 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 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