الرجاء التثبيت
تعتبر لغات البرمجة الحديثة من اغنى اللغات المتوافر فيها شتى انواع التركيبات البرمجية التي تساعد المبرمج على ان يكون برنامجه بغاية الروعة
ومن هذه اللغات الموجودة لدين هي الجافا وايضا السي شارب وسوف نتحدث اليوم عن شيء مهم جدا لم يكن موجودا في لغات البرمجة الا وهو ال
error handling وهذه المكانيكية تتيح للمبرمج حتى الإبتعاد عن الأخطاء التي تحدث في اوقات التنفيذ اي التشغيل وكما كلنا
نعلم فإن لغات البرمجة السابقة كانت فقط تتحمل مسؤولية الأخطاء التي تحدث اثناء تحميل البرنامج اي في حالة تحويله الى لغة آله اي في حالة
ان يتم عمل ترجمة لهذا البرنامج لكن السي شارب والجافا تقدمان لنا امكانية ان نعمل على عملية تجاهل الخطأ في البرنامج بالمناسبة هذه المكانيكية
موجودة منذ زمن بعيد في اللينوكس حيث ان اللينوكس في حالة وجود dead lock يعمل تجاهل كامل للخطأ اي ان الليونوكس قد طور
هذه الأمكانية لأبعد الحدود لدرجة عمل التجاهل ولكن نظم التشغيل ويندوز لا يستطيع سوى ان يعمل على عدة خوارزميات تعمل على ان تمنع حدوث الdead lock
ارجو ان تكونوا تعلموا ما هو ال dead lock اذا لم تكونو تعلمو سوف اشرح لكم بالتفصيل فقط اذكرو لي في نهاية المقاله لنعد الى الى موضوعنا ...
وهي حالة مشابهه للأخطاء التي سبق ان تحدثنا عنها الا وهي الأخطاء التي تحدثت عنها في السابق وكثيرا ما تستعمل ال error handling
في عمليات قواعد البيانات وفي عمليات القسمة على صفر وعمليات خروج الحد المعين للمصفوفة عن الحد الموضوع لها وهذه من الأخطاء الشائعة التي جميعا من نقع فيها
وتتكون الerror handling في كلا
اللغتين من ثلاث اجزاء الا وهي
try{
هنا يتم عادة وضع الجمل التي يتم تنفيذها والتي يتوقع حصول خطأ فيها
}
اذا اردت ان تعرف الخطأ الذي يحدث لديك في البرنامج فما عليك الا ان تجعل عذا الخطأ يحدث وبكل سهولة عندما تظهر لك شاشة الخطأ ان تحفظ اسم الخطأ وتضعه في اقواس الجزء catch ()
catch (هنا بالعادة يتم وضع الخطأ المتوقع حصلوه في الجمل التي وضعت في جملة try )
{
هنا يتم وضع الجملة التي تريد اظهارها للمستخدم اقصد الرسالة
}
اما الجزي الأخير من الerror handling فهو اختيار خياري الا وهو finally
وفي حالة حدوث الخطأ فإن الدالة clr تستدعي او تعمل رمي الل exception واذا حدث خطأ في جملة الtry فإن هذه الجملة بعد حدوث الخطأ فإنها سوف تتلاشي او انها
سوف تصبح عديمة الفائدة .
وايضا اذا كان هناك فقط catch فإن الfinally هي اختيار خياري وليس اجباري ام اذا لم يكن هناك اي catch فإن الfinally هي اختيار اجباري وايضا هناك وظيفة اساسية
لل finally الا وهي انه عندما لا يتم التقاط الخطأ بواسطة جمملة catch فإن الfinally تلقتط الخطأ مباشربة بعد وجود الcatch وهناك جملة يجب ان ننوه لهه
انه في حالة وجود catch يجب على الfinally ان تكون بعد اخر جملة catch حتى لا تسبب اي اخطاء وبالمناسبة فإن جلة error handling الموجودة في كلا
لغتي البرمجة الجافا والسي شارب تساعد مبرمجي المترجمات على سهولة عمل مترجماتهم بسرعة قصوى وسهوله وسلاسة تامة .
وهناك خاصيتيين لل error handling متعلقاتبالرسالة التي تظهر لنا في حالة وجود الخطأ الا وهما Message StackTrace
ألخاصية message تخزن رسالة الخطأ الخاصة بالException في حالة حدوثه اما الخاصية stackTrace فهي تختص بالتالي انها تحتوي على الالنص الذي يمثل الmethod
التي استدعت الstack وايضا يمثل الmethods التي لم يتم تنفيذها بالكامل في حالة حدوث الخطأ
وهناك ايضا خاصية اخري في ال error handling الا وهي في حالة انه لم تعجبك الرسالة التي يخرجها لك الerror handling فإنك بكل سهولة تستطيع ان
تغير ماهية الرسالة وايضا تغير اسم الException handlling اي انك تصنع Exception handlling بإسم جديد ورسالة خطأ جديدة
ويسمى هذا النوع الجديد inner Exception وهو ايضا يسمى في البرنامج throught new Exception وهذا مثال على ذلك حيث انك تريد تحويل من
نص ليس برقم الى رقم وتريد اظهار رسالة خطأ جديدة وبالتالي تقوم بفعل التالي انه يقوم بعمل catch للخطأ ومن ثم يقوم بعمل Exception Object يمرر الException
الموجود اصلا في احدى مدخلات الconstructor الexception Object العادية تصيح new innerException من الException
Object الموجودة اصلا .
بهذا المثال سوف نستوضح ما قلناه سابقا لربما انه استصعب عليكم ما قلناه فهذا المثال يوضح بشكل تفضل .
using System;
// demonstrates using the Message, StackTrace and
// InnerException properties
class Properties
{
static void Main( string[] args )
{
// call Method1, any Exception it generates will be
// caught in the catch handler that follows
try
{
Method1();
}
// Output string representation of Exception, then
// output values of InnerException, Message,
// and StackTrace properties
catch ( Exception exception )
{
Console.WriteLine(
"exception.ToString(): \n{0}\n",
exception.ToString() );
Console.WriteLine( "exception.Message: \n{0}\n",
exception.Message );
Console.WriteLine( "exception.StackTrace: \n{0}\n",
exception.StackTrace );
Console.WriteLine(
"exception.InnerException: \n{0}",
exception.InnerException );
} // end catch
40 } // end Main
41
42 // calls Method2
public static void Method1()
{
Method2();
}
// calls Method3
public static void Method2()
{
Method3();
}
// throws an Exception containing an InnerException
public static void Method3()
{
// attempt to convert non-integer string to int
try
{
Convert.ToInt32( "Not an integer" );
}
// catch FormatException and wrap it in new Exception
catch ( FormatException error )
{
throw new Exception(
"Exception occurred in Method3", error );
}
} // end method Method3
}
ما حدث في اخر catch في البرنامج يوضح لنا كي تمت سلسلة الأمور في البرنامج حيث قال throw new Exceptionاي انه قصد ان يعمل exception جديد انظر للبرنامج بعناية
سوف ترى ان هذه الmethod قد تم استدعائها الى الmethod الأولى ومن ثم استدعيت للمثود الرئيسية لاحظ انه ما تم تمريره الى constuctor هو throw new Exception
هذا هو الconstructor .
هذا بالنسبة للجزىء الأول من المقالة اما الجزي الأخر فإنه يتحدث عن
Programmer-Defined Exception Classes
الجزيئات الحاملة للخطأ المبرمجة سابقا لا اعلم اذا كانت الترجمة صحيحة 100%
وهو يتحدث عن انك بنفسك انت تنشيء exception ألخاصة بك لا تكون موجودة في السي شارب دوت نت
اي انك انت المبرمج تنشيء هذه ال Exceptions بنفسك وتضيفها الى الدوت نت .
وهذا مثال بسط عللى كيفية انشاء ال Exceptions
using System;
// NegativeNumberException represents exceptions caused by
// illegal operations performed on negative numbers
class NegativeNumberException : ApplicationException
{
// default constructor
public NegativeNumberException()
: base( "Illegal operation for a negative number" )
{
}
// constructor for customizing error message
public NegativeNumberException( string message )
: base( message )
{
}
// constructor for customizing error message and
// specifying inner exception object
public NegativeNumberException(
string message, Exception inner )
: base( message, inner )
{
}
}
وهناك عدة شروط يجب وضعها حتى تستطيع انشاء الexception اولها
1 هو ان يكون اسم الكلاس منتهى ب Exception
2تعريف ثلاث constructors
الأول يستقبل رسالة الخطأ
الثاني يستقبل String argument
3الثالث يستقبل Exception argument
وفي الحلقة القادمة سوف انشر بإذن الله حتى استجمع معلوماتي باقي المقاله وسوف ادمج معها الأمثلة التي ذكرتها في المقالة في ملف نصي .