PDA

View Full Version : تعریف ارور



AbiriAmir
جمعه 03 مهر 1388, 12:58 عصر
سلام
اول میخواستم بدونم که چه کدهایی رو بین try finally و چه کدهایی رو بین try except قرار باید بدیم

بعدم من تو یه برنامه دیدم که کد رو به صورت زیر نوشته بودن:

try
...
except
on e:exception do showmessage(e.Message);
end;

ولی تو یه برنامه دیگه دیدم که کد برای هر ارور گزاشته بود و بعد متن ارور ها رو خودش نوشته بود
حالا سوالم اینه که تو کدهای مختلف که کد ارور های مختلف دارن کد ارور ها رو از کجا بیاریم تا خودمون براش متن تعیید کنیم؟

قبلا از همکاریتون ممنونم

merced
جمعه 03 مهر 1388, 13:24 عصر
شما از e فقط پراپرتي Message‌ رو داري و پراپرتي به عنوان كد نداري (تا جايي كه تو ذهنمه)

براي هر بلاك try چند تا خطاي محدود اتفاق مي افته . من كه متن خطا رو بررسي مي كنم . مثلاً



if Pos('not found' , e.Message ) > 0 then
ShowMessage('Not Found !!');

AbiriAmir
جمعه 03 مهر 1388, 14:33 عصر
شما از e فقط پراپرتي Message‌ رو داري و پراپرتي به عنوان كد نداري (تا جايي كه تو ذهنمه)

براي هر بلاك try چند تا خطاي محدود اتفاق مي افته . من كه متن خطا رو بررسي مي كنم . مثلاً



if Pos('not found' , e.Message ) > 0 then
ShowMessage('Not Found !!');


خب متن ارور ها رو از کجا بیارم؟
در ضمن pos چیه؟

AbiriAmir
جمعه 03 مهر 1388, 14:35 عصر
راستی نگفتین اصلا چرا try finally و try except استفاده میکنیم...

shervin farzin
جمعه 03 مهر 1388, 14:46 عصر
سلام
Try / Except به اين ترتيب كار ميكنه كه اگر در حال اجراء كد هاي بدنه Try خطايي رخ داد ، اجراء
كد هاي اين بلوك متوقف ميشه و كد هاي بدنه Except اجراء ميشن ، اما اگه خطايي اتفاق نيفتاد كد
مربوط به بدنه Except هرگز اجراء نخواهد شد.
Try / Finaly به اين شكله كه كد بدنه Try اجراء ميشه ، حالا چه در جريان اجراء خطايي رخ
بده يا نه كد هاي بدنه Finaly قطعا اجراء خواهند شد ( بر خلاف Try / Except كه كد بدنه
Except فقط در صورت رخداد خطا اجراء ميشد. )
موفق باشيد.

merced
جمعه 03 مهر 1388, 15:42 عصر
خب متن ارور ها رو از کجا بیارم؟
در ضمن pos چیه؟
اين يه راه حل هست ولي كار جالبي نيست. چون صددرصد روش بهتر و اصولس تري وجود داره
با يه بار انداختن برنامه توي تله و ايجاد اون خطا مي توني متنش رو بدست بياري .
بعضي خطاها متن طولاني دارند و بعضي هم بخشي از متنش متغييره (مثلاً نام فايل داره)

من يه قسمت از خطايي رو كه خودم حدس زده ام رو توي e.Message جستجو مي كنم . اين كار رو با تابع Pos‌ و if‌ هاي تودرتو انجام مي دمو. اگه متن خطا در if ها پيدا نشد در آخرين else همان پيام انگليسي با عنوان خطاي ناشناخته نمايش داده مي شه .

Mahmood_M
جمعه 03 مهر 1388, 22:01 عصر
اول میخواستم بدونم که چه کدهایی رو بین try finally و چه کدهایی رو بین try except قرار باید بدیم
برای Try .. Finally :
به زبان ساده زمانی از این بلوک استفاده میکنیم که لازم باشه بعد از انجام عملیاتی یک خط کد خاص حتما اجرا بشه ...
به عنوان مثال ، به کد زیر دقت کنید :


var
M : TEdit;
begin
M := TEdit.Create(Self);
M.Name := 'MyEdit';
M.Parent := Form1;
M.Free;
end;

در کد بالا ابتدا یک Edit ساخته میشه و بعد مقادیر Name و Parent اون مقدار دهی میشن و در نهایت هم Free میشه ، حالا اگر در بین کدهای بالا و قبل از M.Free یک خطا اتفاق بیافته ، اون وقت رویدادی که توش هستیم متوقف شده و دیگه Edit ساخته شده آزاد نخواهد شد ...
به عنوان نمونه ، یک دکمه و یک Edit بر روی فرم بگذارید ، نام Edit را به MyEdit تغییر دهید ، و کد زیر را در رویداد OnClick دکمه قرار بدید :


var
M : TEdit;
begin
M := TEdit.Create(Self);
M.Parent := Form1;
M.Name := 'MyEdit';
ShowMessage('Hi');
M.Free;
end;

زمانی که برنامه به قسمت " M.Name := 'MyEdit' " می رسد ، با یک خطا مواجه خواهیم شد ، چون Edit ای با نام MyEdit در فرم مورد نظر قرار داره ... ، حالا اگه پیغام ظاهر شده را OK کنید ! می بینید که برنامه کدهای بعدی را اجرا نخواهد کرد ، برای فهم بهتر من یک ShowMessage در بین کد گذاشتم که با اجرا نشدن اون این موضوع فهمش راحت تر میشه ...
پس با توضیحات بالا ، Edit ایجاد شده آزاد هم نخواهد شد چون برنامه به کد M.Free نمی رسد ...
حالا اگه این کد رو در بلوک Try .. Finally به صورت زیر قرار بدیم ، مشکل حل میشه :


var
M : TEdit;
begin
M := TEdit.Create(Self);
try
M.Parent := Form1;
M.Name := 'MyEdit';
finally
M.Free;
end;
end;

خصوصیت Try .. Finally اینه که بدون توجه یه هر خطایی که در بدنه Try اتفاق می افته ، کد موجود در قسمت Finally رو اجرا میکنه ، پس در کد بالا Edit ما ساخته میشه اما چون خاصیت Name نمی تونه مقدار دهی بشه ، خطایی رخ میده و برنامه از بلوک Try به Finally می پره و Edit رو آزاد می کنه ...

-------------------------------
اما برای Try .. Except قضیه کمی متفاوته ...
همونطور که دوستمون هم اشاره کردند ، در این بلوک اجرای کد قسمت Except به ایجاد یا عدم ایجاد خطا در قسمت Try بستگی داره ...
یعنی اگه در قسمت Try خطایی رخ داد ، قسمت Except هم اجرا خواهد شد در غیر این صورت برنامه از قسمت Except می پره ...
با توجه به توضیح بالا میشه فهمید که Try .. Except برای چه زمانی مناسب هست ...

-------------------------------

حالا سوالم اینه که تو کدهای مختلف که کد ارور های مختلف دارن کد ارور ها رو از کجا بیاریم تا خودمون براش متن تعیید کنیم؟
از اینجا : http://www.delphifaq.com/faq/delphi/delphi_ide/f153.shtml
فکر کنم توی Help دلفی هم باشه ...
از تابع GetLastError هم می تونید برای گرفتن مقدار کد آخرین خطای ایجاد شده استفاده کنید ...

اگه از توابع API استفاده میکنید ، در مورد تابع SysErrorMessage در Help دلفی و در اینترنت جستجو کنید ...
جستجو در مورد عبارت Raise هم میتونه مفید باشه ... ، این عبارت در بلوک Try .. Except کمکتون میکنه ...

موفق باشید ...

AbiriAmir
شنبه 04 مهر 1388, 17:30 عصر
از اینجا : http://www.delphifaq.com/faq/delphi/delphi_ide/f153.shtml

موفق باشید ...

خیلی ممنون

ولی این سایته باز نمیشه...
در کل به خاطر این مطالب مفید و کاملتون ممنونم...

Mahmood_M
یک شنبه 05 مهر 1388, 00:17 صبح
ولی این سایته باز نمیشه...
این لیستی هست که توی اون صفحه قرار داره ، البته کامل به نظر نمی رسه !


1 Invalid function number
2 File not found
3 Path not found
4 Too many open files
5 File access denied
6 Invalid file handle
12 Invalid file access code
15 Invalid drive number
16 Cannot remove current directory
17 Cannot rename across drives
100 Disk read error
101 Disk write error
102 File not assigned
103 File not open
104 File not open for input
105 File not open for output
106 Invalid numeric format
200 Division by zero
201 Range check error
202 Stack overflow error
203 Heap overflow error
204 Invalid pointer operation
205 Floating point overflow
206 Floating point underflow
207 Invalid floating point operation
210 Object not initialized
211 Call to abstract method
212 Stream registration error
213 Collection index out of range
214 Collection overflow error
215 Arithmetic overflow error
216 General protection fault


موفق باشید ...