PDA

View Full Version : کاربرد Raise چیست؟



p_ooya
سه شنبه 30 تیر 1388, 09:52 صبح
سلام به همه.
کاربرد raise و raiseexception چیست؟

سپاس.

Saeed_m_Farid
سه شنبه 30 تیر 1388, 16:34 عصر
سلام به همه.
کاربرد raise و raiseexception چیست؟

سپاس.
سلام
کاربرد Raise رو تو 3 بخش زیر میشه دسته بندی کرد :


زمانیکه ما قصد داریم در حالت خاصی خودمان تولید Exception کنیم، یعنی نمونه ای از کلاس Exception تولید کرده و برای کاربر نهایی یا استفاده کننده سطح بالاتر کد موردنظر تولید می کنیم. مثلاً فرض کنید برنامه شما نیاز به بررسی صحت قفل نرم افزاری داشته باشد، درصورتیکه signature موردنظر درست نبود شما می تونید مثلاً از کد زیر استفاده کنید :
raise EInOutError.Create('Require signature not present');، البته در یه سطح پایین تر؛ شما می تونید اشاره گر تابع یا پروسیجر تولید کننده Exception رو هم مشخص کنید و به فراخواننده یادآور بشید که پوینتر تابع فراخوانی شده برای بررسی بیشتر چی بوده تا از این طریق اطلاعات جامع تری به فراخواننده برای رهگیری خطای رخداده ارائه بدید :
raise Exception.Create('Missing parameter') at @MyFunction; باید توجه داشته باشید که در صورت ایجاد حالت استثناء دیگه کنترل از دست شما خارج میشه و به داخلی ترین بلاک try...except که کد شما رو فراخوانی کرده بر میگرده و ...
حالت بعدی، زمانیه که شما احتمال میدین که شاید کدتون بیافته تو حالت استثناء ولی مجبورید از try...except هم استفاده کنید و از طرف دیگه باید Exception رو به فراخواننده انتقال بدین (از جمله در مواردی که نیاز به آزاد سازی منابع دارید)، مثلاً وقتی با فایلها یا محدودیت حجمی هارد و ... درگیر هستید ( بقول معروف نخواهید که کدتون Exception رو بخوره! و به فراخواننده نده)، مثل کد زیر :

function GetFileList(const Path: string): TStringList;
var
I: Integer;
SearchRec: TSearchRec;
begin
Result := TStringList.Create;
try
I := FindFirst(Path, 0, SearchRec);
while I = 0 do
begin
Result.Add(SearchRec.Name);
I := FindNext(SearchRec);
end;
except
Result.Free;
raise;
end;
end;

حالت سوم هم زمانی هست که شما قصد دارید Exception رو خودتون عوض کنید، یعنی متن استثناء رو عوض کنید (مثلاً Exception ای که انتظار رخ دادنشو دارید فارسی نمایش داده بشه و ...)؛ در اینحالت هم میتونید از raise استفاده کنید :
type
ETrigError = class(EMathError);
function Tan(X: Extended): Extended;
begin
try
Result := Sin(X) / Cos(X);
except
on EMathError do
raise ETrigError.Create('Tan ورود مقدار نادرست برای تابع');
end;
end;