![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос по исключениям
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]аборт например