TRY..EXCEPT ?

9 отговора 391 прегледа
#1

TRY..EXCEPT ?

zasto slednata programa na DELPHI mi dava RUNTIME ERROR 200 (delene na 0)?



PROGRAM A;
USES WINDOWS;
VAR
AA,B,C:INTEGER;
BEGIN
AA:=1; B:=0;
TRY
C:=AA DIV B;
EXCEPT
MESSAGEBOX(0, 'AAAA','AAAAA',MB_OK);
HALT;
END;
MESSAGEBOX(0, 'BBBB','BBBBB',MB_OK);
HALT;
END.



Отговор
в отговор на CALL-151 #2

Re: TRY..EXCEPT ?


TRY

C:=AA DIV B;

EXCEPT
on EDivByZero do
MESSAGEBOX(0, 'AAAA','AAAAA',MB_OK);

HALT;

END;

Редактирано от mn_t на

Отговор
в отговор на mn_t #3

Re: TRY..EXCEPT ?

interesno!!!

zaraboti kato vklucih SYSUTILS !!!!

???

Отговор
в отговор на CALL-151 #4

Re: TRY..EXCEPT ?

Това е изключение на процесора и може try..except да не го прихваща. По-добре си проверявай всеки път - не може да се разчита на ексепшън хендлинга да ти прихваща изключения от ниско ниво. Обикновено се прихващат грешки с паметта и КОМ изключения.

Отговор
в отговор на CALL-151 #5

Re: TRY..EXCEPT ?

Sorry, забравих да го напиша. Там е дефинирано.

Отговор
в отговор на CALL-151 #6

Re: TRY..EXCEPT ?

Мдам, преди заку... обяд де правя куп пропуски.
on EDivByZero do
begin
MessageBox(...);
halt;
end

Отговор
в отговор на CALL-151 #7

Re: TRY..EXCEPT ?

от хелпа:
When an application uses the SysUtils unit, all runtime
errors are automatically converted into exceptions.
Errors that would otherwise terminate an application—
such as insufficient memory, division by zero,
and general protection faults—can be caught and handled.

Не можах да се въздържа. Предишните отговори
не са много коректни...

>mn_t
не е необходимо изрично да се пише
on EDivByZero do ...
достатъчно е
TRY
...
EXCEPT
ShowMessage('...error...');
END;

on EDivByZero е необходимо
само ако искаш изрично да
провериш, че грешката е именно
деление на нула а не някаква друга.

> AmenhoteplV
>>>Това е изключение на процесора и
може try..except да не го прихваща<<<
Това не вярно. TRY ... except
прихваща всякакви изключения.

Тогава въпроса е защо това не
го е прихванало. Ами отговора е:
тук няма изключение - какво да прихване?

Как така да няма изключение?
Ами така!
Изключението е ОБЕКТ.
и се създава с RAISE TSomeException.Create(...)

EDivByZero е дефинирано в SysUtils.
Вижте пак в началото на постинга ми
цитата от хелпа.
Ключовите думи са
"...errors are automatically converted..."
Ако има клас EDivByZero
то някъде където се пресмята делението,
има някой който казва:
raise EDivByZero.Create(...);
Ако не е дефиниран този клас,
то няма и raise ...
Просто има RunTime Error.
Така, че в случая наистина няма
изключение.

Както знаете може са си дефинирате
собствени изключения, които
да "гърмят" при обстоятелства зависещи
от логиката на вашата програма.
...
if NoMoneyInBank then
raise ENoMoney.Create('Първо внесете пари преди да теглите :) ');
...
Но някъде в кода трябва някой
да каже raise...

Просто в делфийските библиотеки
това вече е направено. Ако се
порови човек може да ги намери.

В резюме: try except прихваща raise.
Ако няма raise то
except няма какво да прави.

Отговор
в отговор на Eмил #8

Re: TRY..EXCEPT ?

aaaa...... iavno e taka!
a, men mi trebva da hvastam izklucenia koito sam predizvikvam taka ce mai sava i bez SYSUTILS...

Отговор
в отговор на CALL-151 #9

Re: TRY..EXCEPT ?

>>>men mi trebva da hvastam izklucenia koito sam predizvikvam
taka ce mai sava i bez SYSUTILS... <<<

Ами не съвсем.
Ако си направиш твое изключение:

EMyException = class(Exception)
...
end;

обикновено ти го наследяваш от
класа Exception, който е в SYSUTILS.
Така, че без него не можеш (почти).
Формално в raise може да се
създава който и да е обект,
не е задължително да е наследник
на Exception, но не е препоръчително.
Освен това защо искаш да избягаш
от SYSUTILS? В него има много неща
(то и затова е кръстен SYSUTILS)
освен изключенията без
които трудно ще минеш.

Отговор
в отговор на Eмил #10

Re: TRY..EXCEPT ?

az misla da si go generiram s RAISEEXCEPTION!
zasega mai rbaoti, no kato celo vsicko se darji stranno! veroiatno poricinata e druga... :-)

Отговор