الإستثناءات

الفصل الثامن

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

على سبيل المثال

type
     THuman=class(Tobject)
        Constructor Create(aName: String);

        private
               fName: String;
              Function GetName: String;
              Procedure SetName(aName: String);

        public
              property Name: String read GetName write SetName;
              procedure PrintMe; virtual;
              class procedure About; virtual;

     end;

     { TEmp }

     EValueError=class(Exception);
     TEmp=class(THuman)
         Constructor Create(aName:String; aSalary: Integer);

         private
                fSalary: Integer;
                Function GetSalary: Integer;
                Procedure SetSalary(aSalary: Integer);


         public
               property Salary: Integer read GetSalary write SetSalary;
               procedure PrintMe; override;
               class procedure About; override;
               class Function GetNHumans: Integer;
     end; 

لدينا صف THuman و TEmp الذى يرثه ولدينا نوع خطأ EvalueError -استثناء ليشير الى قيمة خاطئة- وهو يرث الصف Exception
يهمنا من جزئية TEmp جزئية تحديد المرتب
function TEmp.GetSalary: Integer;
begin
Result:=self.fSalary;
end;

procedure TEmp.SetSalary(aSalary: Integer);
begin
if aSalary <= 0 then Raise EValueError.Create('You should offer more!'); self.fSalary := aSalary; end; [/sourcecode] لاحظ اذا كان المرتب قيمته اقل من او تساوى 0 فيتم رفع -القاء- استثناء بإستخدام Raise وتأخد كائن من الإستثناء وهنا هو EValueError ونمرر للمشيد له رسالة you should offer more عند التنفيذ نقوم بوضع الكود بين قسمى try, except [sourcecode lang="delphi"] try e1.Salary:= -20; except on ex:EValueError do begin writeLn('invalid salary...'); writeLn('EMessage: ', ex.Message); end; end; [/sourcecode] فيتم محاولة تنفيذ الكود فى قسم try وعند حدوث استثناء من نوع EValueError نقوم بتعريف هذا الإستثناء بإسم ex لنستطيع الوصول الى معلومات مفيدة حوله كالرسالة اللتى يحملها ex.Message نحتاج ايضا فى بعض الأحيان الى تنفيذ كود دائما كغلق اتصال مع قاعدة بيانات او غلق ملف او او -تستخدم غالبا للتخلص من ال resources المفتوحة- وهنا نأتى الى try/finally [sourcecode lang="delphi"] try //somecode finally //executed..[/sourcecode] توفر اللغات طريقة لدمج try, except, finally سويا [sourcecode lang="delphi"]try //somecode except //somecode on error finally //always executed.. [/sourcecode] ولكن فى FPC تستطيع تحقيق ذلك بإنشاء قسم فرعى ل try/except داخل try/finally كالتالى مثلا [sourcecode lang="delphi"]try try e1.Salary:= -20; except on ex:EValueError do begin writeLn('invalid salary...'); writeLn('EMessage: ', ex.Message); end; end; finally WriteLn('Always executed..'); [/sourcecode]

الأوسمة: , ,

أضف تعليق