الفصل الثامن
الإستثناء هو حدوث شئ مخالف للمسار الطبيعى للبرنامج فنقوم بوضع ترتيبات خاصة لمعالجة هذه الحالات على سبيل المثال لدينا موظف وقمنا بتحديد المرتب له الى 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]
الأوسمة: exceptions, fpc, Lazarus
أضف تعليق