1- Exception ها رو نخورید!
کد زیر رو در نظر بگیرید :
try
SomeRoutineThatSometimesCausesAHardToFindAccessViolation
except
end;
در این قطعه کد هر نوع استثنایی رو به دام انداخته ایم اما هیچ اقدامی برای آن نشده است نه پیغامی نه کار خاصی ... در واقع با این کار ، کاربر ممکن است هیچ خطایی رو نبینه و برنامه هم به درستی کار نکنخ و Silent بمونه...
۲- Exception رو به دام نیاندازید و متن پیغامش رو خودتون دوباره Message نکنید زیرا به هر صورت نمایش داده خواهد شد!
کد زیر را در رابطه با این مطلب در نظر بگیرید:
try
SomeCodeThatMightCauseAProblem
except
on E: Exception do
begin
MessageDlg(E.Message, mtWarning, [mbOK], 0);
end;
end;
۳- خودتون به صورت ساختگی Exception ایجاد نکنید! به طور مثال ممکن هست کاری شبیه به کد زیر انجام داده باشید که صحیح نیست :
function StringIsInteger(aStr: string): Boolean;
var
Temp: integer;
begin
Result := True;
try
Temp := StrToInt(aStr);
except
Result := False;
end;
end;
4- یک نکته ی دیگر هم در استفاده از بلوک try ... except ... end هست که گاهی اوقات قابل استفاده ست.
شما میتونید پیغام های خطا رو از داخل فانکشن و یا پروسیجر فرزند به پدر پاس بدید و پدر بر اساس اون تصمیم بگیره کار خاصی رو انجام بده و یا همون پیام رو مستقیم نمایش بده...
به کد زیر توجه که کنید در فانکشن فرزند یک متغیر لیبل تعریف شده ولی Create نشده و مقداری به Caption اون اختصاص داده شده ، در نتیجه Exception ایجاد میشه و میاد بیرون اما نکته اینجاست که اگر پدری باشه که مسیج رو دریافت کنه فانکشن فرزند میتونه Raise کنه و میشه در سمت پدر تصمیم گیری برای حرکت بعدی رو انجام داد،
به کد نگاهی بیاندازید :
function TForm1.child: string;
var lbl:TLabel;
begin
try
lbl.Caption:= 'aaaaaa';
except
raise Exception.Create('MY Error Message');
end;
end;
//=================================
procedure TForm1.btn1Click(Sender: TObject);
begin
try
child;
except on E:exception do
ShowMessage(E.Message);
end;
end;