Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.12.13;
Скачать: CL | DM;

Вниз

Вопрос по исключениям   Найти похожие ветки 

 
Nucer   (2009-10-22 15:28) [0]

Всегда ли будет срабатывать блок "on E: Exception"? Или есть случаи, когда сообщение будет отображено только во втором варианте?

try
...
except
on E: Exception do
begin
if E.Message <> "" then ShowMessage(E.Message) else ShowMessage("Exception");
end;
end;


try
...
except
ShowMessage("Exception");
end;


 
Сергей М. ©   (2009-10-22 15:37) [1]

Всегда.


 
Медвежонок Пятачок ©   (2009-10-22 15:37) [2]

аборт например


 
Ухарь   (2009-10-22 15:41) [3]

у аборта мессадж не пустой


 
Сергей М. ©   (2009-10-22 15:44) [4]


> аборт например


EAbort есть наследник Exception и ловится в except-блоке точно так же как и иные дельфийские Exception-объекты.


 
Медвежонок Пятачок ©   (2009-10-22 15:44) [5]

у аборта его нет вообще. "тихое" исключение


 
Медвежонок Пятачок ©   (2009-10-22 15:46) [6]

пардон. конечно если его не обрабатывать :)


 
Сергей М. ©   (2009-10-22 15:46) [7]


> у аборта мессадж не пустой


А причем здесь пустота ?
Сообщение-то все равно будет и в том и в другом случае, хоть пустое хоть непустое


 
Медвежонок Пятачок ©   (2009-10-22 15:49) [8]

Я про другое.
Аборт мог вызвать другой программист.  С умыслом вызвать или по недомыслию. Например вместо Exit

И он допустим не ожидает что кто-то будет его перехватывать.


 
Сергей М. ©   (2009-10-22 15:52) [9]


> он допустим не ожидает что кто-то будет его перехватывать


А это уже драма того кто его перехватил и с умыслом или по недомыслию не ре-райзит его


 
Nucer   (2009-10-22 15:56) [10]

Спасибо за ответы.

Еще один вопрос.
try
...
except
on E: ETest do
begin
ShowMessage("ETest");
end;
ShowMessage("Exception"); //Для всех исключений (в том числе ETest)
end;


Неужели такой синтаксис не предусмотрен?


 
Сергей М. ©   (2009-10-22 16:00) [11]

If the exception block specifies an else clause, the else clause handles any exceptions that aren"t handled by the block"s exception handlers. For example,

try
...
except
 on EZeroDivide do HandleZeroDivide;
 on EOverflow do HandleOverflow;
 on EMathError do HandleMathError;
else
 HandleAllOthers;
end;


 
Nucer   (2009-10-22 16:04) [12]

Нужен не else, а код для всех исключений (в том числе тех, которые были обработаны отдельно).

Допустим, для разных исключений мне надо вывести разные сообщения, но в итоге все равно выполнить один и тот же код по обслуживанию.


 
Anatoly Podgoretsky ©   (2009-10-22 16:14) [13]

> Nucer  (22.10.2009 15:28:00)  [0]

Всегда будут срабатывать оба, сначала первое, а потом второе, если конечно будет исключение.


 
Сергей М. ©   (2009-10-22 16:24) [14]

Так устроит

type
 EMyException1 = class(Exception);
 EMyException2 = class(Exception);
 EMyException3 = class(Exception);

procedure TForm1.Button6Click(Sender: TObject);

begin

try
 raise EMyException3.Create("");
except
 on e:Exception do begin
   if e is EMyException1 then ShowMessage("Exception EMyException1 trapped")
   else if e is EMyException2 then ShowMessage("Exception EMyException2 trapped")
   else if e is EMyException3 then ShowMessage("Exception EMyException3 trapped");
   ShowMessage("Handling any exceptions, currently exception class is " + e.ClassName);
 end;
end;


?


 
Nucer   (2009-10-22 16:29) [15]


> Всегда будут срабатывать оба, сначала первое, а потом второе,
>  если конечно будет исключение.

Вы не так поняли. Это два отдельных варианта обработки исключений, а не код из одной функции. Я имел ввиду, может ли блок "on E: Exception do" пропустить часть исключений из тех, что попали бы в обычный блок except end.
Если сформулировать иначе, то возможен ли случай, когда будет отображено сообщение else:
try
...
except
on Exception do ShowMessage("Exception");
else ShowMessage("else");
end;


 
Nucer   (2009-10-22 16:32) [16]


> Сергей М. ©   (22.10.09 16:24) [14]

Да, спасибо большое, именно это и надо было.


 
Сергей М. ©   (2009-10-22 16:34) [17]

Нет, не возможен.
Все дельфийские объекты-исключения имеют либо класс Exception либо класс-наследник класса Exception.
Так что ловушку on Exception do не должно миновать ни одно исключение.



Страницы: 1 вся ветка

Текущий архив: 2009.12.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.018 c
1-1210851369
Nucer
2008-05-15 15:36
2009.12.13
Взаимодействие с service (службой)


1-1227817532
DmitryG.
2008-11-27 23:25
2009.12.13
Balloon Tooltip


10-1121666059
YuriS
2005-07-18 09:54
2009.12.13
Borland Socket Server


2-1256545768
@!!ex
2009-10-26 11:29
2009.12.13
Перемещение TrackBar кликом


2-1256302450
Сергей
2009-10-23 16:54
2009.12.13
Не работает WaitForSingleObject.