الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الاستثناءات Exceptions

مغلق
بدأه محمد سامر أبو سلو في 1 يناير 2007 · 7 رد · 5,595 مشاهدة · في قسم الدروس والمواضيع المتميزة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

التقاط استثناء معين

لالتقاط استثناء نستعمل بلوك 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

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#2

بارك الله فيك

لا تَقُولن لِشيءٍ ذَا نَاقِصٌ ... وَلَكن أَعمل وَقُل ذَا أكملُ

#3

رااااااااائع ..

شكراً جزيلاً ..

تحياتي العطرة ..

Dr.Cisco

#4

بارك الله فيك استاذنا العزيز

درس من الجذور, يأسس المبتدئين على منهج وقاعدة صحيحة.

فواثق الخطوات يمشي ملِك ً .

في المثال يتضح المقال

#5

في المرفق بعض الفئات الخاصة بالاستثناءات وشرح سريع لكل منها

Error_Classes.rar

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#6

السلام عليكم ورحمة الله وبركاته

جزاك الله خيراً أخي محمد سامر أبو سلو على هذا الشرح

ولكن لي سؤال في بعض الاحيان تُستخدم الكلمة Throw في الجزء Catch

ما معنى هذه الكلمة أو ما هي وظيفتها :rolleyes: معلش أنا منتقل جديد من الاصدار السادس

فتحملني . جزاك الله خيراً .

مواضيع و دروس
الكتابة بعدة ألوان داخل الــ TetxBoxمكتبة الأكوادتحميل الــ Visual Basic Express 2005
تحميل فيجوال بسيك 6أكواد × أكواددروس في الخوارزميات
لتحميل عدة إصدارات من كريستال ريبورتتحميل برنامج Activ Skin 4.3جمل الــ Sql من الألف إلى الياء
معظم المواقع المختصة بالفيجوال بيسيكموقع كويس للأيقوناتمرجع شامل لأدوات ActivX
كيفية نطق الحرف المكتوب شرح عن كيفية إقامة علاقة مع Data Reprot باستخدام الــ DataEnvironment علاقة مع الـ Datareport بدون استخدام DataEnvironment (( شرح ))
كتاب Migrating From DAO to ADOإضافة لـ VB6 بريمج IndenterVB, إضافة لبيئة تطوير فيجوال بيسك 6حوار بينى و بين عضو حول ال winsock , اتمنى ان يعجبكم
Smart Indenter 3.5 لتنسيق الأكواد, هديه لكل الأعضاء السلسلة الدهبية في المواضيع العلمية ، إستغلال الـ Balloons في الـ Windows XP مصفوفات الأدوات Control Arrays افكار وتلميحات ! , لمن افتقدها من أيام الـ VB6.0
جعل خلفية الـ Mid Form تظهر بالكامل خواص الاداة Winsock لربط الاجهزة عن طريق الانترنتكيف يتم عمل تقارير بإستخدام HTML

7.gif
#7

تستخدم throw لرمي استثناء فأحيانا أنت كمبرمج تضطر لرمي استثناء معين أو حتى إنشاء استثناء جديد خاص بك ورميه وذلك كما ورد في القسم إطلاق استثناءاتك الخاصة في هذا المقال

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

#8

ترشيح الأخطاء في قسم CATCH في بلوك TRY عند اصطياد الأخطاء

يوفر لنا قسم Catch في بلوك Try أكثر من خيار لترشيح الأخطاء وإحدى هذه الطرق هي بتحديد نوع الخطأ المراد اصطياده وهنا يجب عليك البدء بالنوع الأكثر تحديدا منتهيا بالنوع الأكثر عمومية بما أن قسم Catch يتم تنفيذه بترتيب كتابته كما يمكن استخدام When في قسم Catch لتحديد أكثر دقة مثل تحديد رقم خطأ معين حيث يمكنك دمج هذه الأساليب للحصول على الطريقة المناسبة لبرنامجك

مثال:

Try
	 ' كودك المحتمل ان يسبب خطأ
Catch ex As System.IO.IOException
	 ' كود للتفاعل مع الخطأ IOException
Catch ex As System.NullReferenceException
	 ' كود للتفاعل مع الخطأ NullReferenceException
Catch ex As Exception When Err.Number = 5 Or Err.Number = 8
	 ' كود للتفاعل عندما يكون رقم الخطأ 5 أو 8
Catch ex As Exception
	 ' كود للتفاعل مع أي خطأ آخر
End Try

عن عائشة رضي الله عنها أن النبي صلى الله عليه وسلم قال: إن الله يحب إذا عمل أحدكم عملا أن يتقنه

نعيب زماننا والعيب فينا ... وما لزماننا عيب سوانا

ونهجو ذا الزمان بغير ذنب ... ولو نطق الزمان لنا هجانا

محمد سامر أبو سلو

هذا الموضوع مغلق.

مواضيع مشابهة