Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос по исключениям


Nucer ©   (2009-10-22 15:28:00) 

Всегда ли будет срабатывать блок "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 16:34:00) [1]

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


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


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

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


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


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

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


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

Так устроит

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;


?


Anatoly Podgoretsky   (2009-10-22 16:14:00) [5]

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

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


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

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

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


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

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 15:56:00) [8]

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

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


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


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


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


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


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

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

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


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


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


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


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

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


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

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


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


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


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


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

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


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

Всегда.


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо