الأربعاء، 18 ديسمبر 2013

أساسيات البرمجة سي شارب معالجة الاستثناءات C# - Exception Handling

 معالجة الاستثناءات C# - Exception Handling

الأسثناء Exception :-

الإستثناء هو خطأ يظهر أثناء تشغيل البرنامج سواء كان خطأ مفتعل أو نتيجة سهو المبرمج عن وضع قيود محدد للتعامل مع البرنامج مثلا حقل نص يستخدم لادخال الارقام وسها المبرمج عن وضع قيد يجبر المستخدم على ادخال ارقام بدل نصوص.او مثل القسم على صفر.
يقسم معالجة الاستثناءات الى اربع اقسام.
  1. try وفي هذا البلوك يتم وضع الكود الذي يجب معالجة استثناء له عند حدوث الاخطاء ويجب ان يتبعه اما واحد من catch او عدة جمل Catch.
  2. catch وهي تشير الى وقوع الخطأ وتم العثور عليه وهنا يتم معالجة الخطأ عند حدوثه.
  3. finally وتستخدم سواء حدثجب   الخطأ او  لم يحدث سوف يتم  تنفيذ الكود الذي تحتويه مثل إغلاق ملف. نفترض اننا قمنا بفتح قاعدة بيانات او ملف وحدث خطأ فهنا يجب إغلاق الملف سواء حدث الخطأ أو لم يحدث.
  4. throw وهي تقوم برمي الاخطأ اي بمعنى تجاهل الخطأ والانتقال الى الكود التالي لتنفيذه وغالبا ما يستخدم من قبل المبرمجين المبتدائين وذوي قلة الخبرة ولكن لا يمنع ذوي الاحتراف استخدامه خاصة لكتابة الاخطأ في ملف log.

الصيغة العامة لمعالجة الإستثناءات.

try
{
   //الكود الذي قد ينتج عنه خطأ
}
catch( ExceptionName e1 )
{ 
   // الاسثناء الاول
}
catch( ExceptionName e2 )
{
   // الاسثناء الثاني
}
catch( ExceptionName eN )
{
   // الاسثناء الثالث
}
finally
{
   // الجملة التالية ستنفذ سواء حدث خطأ أو لم يحدث
}

فئة معالجة الاستثناءات

1- System.ApplicationException

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

2- System.SystemException

وهذه الفئة هي الفئة الاساسية التي   تحتوي على الاستثناءات المعرفة مسبقا من قبل اللغة ومن اهم الاستثناءات المعرفة سنردها في الجدول التالي.

اسم فئة الاستثناءالوصف
System.IO.IOExceptionمعالجة اسثناءات الادخال والاخراج مثل اخطاء فتح ملف او الكتابة في ملف
System.IndexOutOfRangeExceptionاسثناء معالجة الفهرس الذي خارج المدى في المصفوفات.
System.ArrayTypeMismatchExceptionاستثناء معالجة عند حدوث خطأ في نوع  المصفوفة مثل دمج مصفوفتين ليست من نفس نوع البيانات
System.NullReferenceExceptionاستثناء عندما لا يوجد مرجع للكائن او انها يشير لقيمة فارغة
System.DivideByZeroExceptionاستثناء القسمة على صفر
System.InvalidCastExceptionاستثناء عند التحويل من نوع بيانات الى اخر .
System.OutOfMemoryExceptionاستثناء عندما لا توجد مكان في الذاكرة.
System.StackOverflowExceptionاسثناء يحدث عندما يصبح مدى المكدس لا يتسع قيم.

مثال على معالجة الاستثناءات:-

في المثال التالي نعالج خطأ القسمة على صفر.
using System;
namespace ErrorHandlingApplication
{
    class DivNumbers
    {
        int result;
        DivNumbers()
        {
            result = 0;
        }
        public void division(int num1, int num2)
        {
            try
            {
                result = num1 / num2;
            }
            catch (DivideByZeroException e)
            {
                Console.WriteLine("Exception caught: {0}", e);
            }
            finally
            {
                Console.WriteLine("Result: {0}", result);
            }

        }
        static void Main(string[] args)
        {
            DivNumbers d = new DivNumbers();
            d.division(25, 0);
            Console.ReadKey();
        }
    }
}


ناتج الكود:-

Exception caught: System.DivideByZeroException: Attempted to divide by zero. 
at ...
Result: 0


تعريف استثناء من قبل المستخدم.

عند تعريف استثناء من قبل المبرمج  فيجب وراثة الفئة ApplicationException كما ذكرنا سابقا.


using System;
namespace UserDefinedException
{
   class TestTemperature
   {
      static void Main(string[] args)
      {
         Temperature temp = new Temperature();
         try
         {
            temp.showTemp();
         }
         catch(TempIsZeroException e)
         {
            Console.WriteLine("TempIsZeroException: {0}", e.Message);
         }
         Console.ReadKey();
      }
   }
}
public class TempIsZeroException: ApplicationException
{
   public TempIsZeroException(string message): base(message)
   {
   }
}
public class Temperature
{
   int temperature = 0;
   public void showTemp()
   {
      if(temperature == 0)
      {
         throw (new TempIsZeroException("Zero Temperature found"));
      }
      else
      {
         Console.WriteLine("Temperature: {0}", temperature);
      }
   }
}

تحميل الكود السابق:- ملاحظة الانتظار 5 ثواني وسيتم تحويلك لصفحة التحميل وشكرا

ناتج الكود:-
TempIsZeroException: Zero Temperature found

كائن throw الصيغة العامة لالقاء اسثتناء.

Catch(Exception e)
{
   ...
   Throw e
}


Ahmed Ata Almahallawi
Freelancer
IT
IT Help Desk,
SEO experience,PHP,C#,ASPX
Al alami st
gaza -jabaliaGaza Strip
Palestine
ahmed.almahallawi@gmail.com
DOB: 05/10/1984
by +Ahmed Almahallawi 
18/12/2013

التسميات: