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