![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
try .. exception - как вывести сообщение самой ошибки
WebSQLNeederrr © (2008-06-14 19:09:00)с помощью конструкции try .. exceprion можно экранировать ошибки, а как вывести сообщение об ошибке, скажем в Мемо?
Игорь Шевченко (2008-06-15 19:19:00) [1]
> except
> on E: Exception do
> begin
> E.Message := Format('reraise %s', [E.Message]);
> raise;
> end;
> end;
За такой код надо давить
Leonid Troyanovsky (2008-06-15 19:17:00) [2]
> Loginov Dmitry © (15.06.08 18:05) [17]
> Куда reraise девается? То-то же!
Ну и не надо никаких on E: Exception.
Если обработчику неизвестно исключение -
он _обязан_ его пропустить.
--
Regards, LVT.
Loginov Dmitry (2008-06-15 18:05:00) [3]> В дельфи иных исключений и нет.
Я вот про что:
procedure TForm1.Button6Click(Sender: TObject);
var
a, b: double;
begin
a := 1;
b := 0;
try
a := a / b;
floattostr(a);
except
on E: Exception do
begin
E.Message := Format('reraise %s', [E.Message]);
raise;
end;
end;
end;
Куда reraise девается? То-то же!
Leonid Troyanovsky (2008-06-15 18:00:00) [4]
> Loginov Dmitry © (15.06.08 17:42) [15]
> Изменение текста катит только для родных дельфийский эксепшенов.
В дельфи иных исключений и нет.
--
Regards, LVT.
Loginov Dmitry (2008-06-15 17:42:00) [5]to [13], [14]
для системных исключений нельзая изменить текст. Изменение текста катит только для родных дельфийский эксепшенов.
Leonid Troyanovsky (2008-06-15 11:52:00) [6]
> Loginov Dmitry © (15.06.08 10:45) [12]
> Сам обычно использую такую конструкцию:
И сейчас будем ругать.
Хотя класс исключения будет тот же, но иная
дополнительная информация будет утеряна.
Сравни
try
raise TMyException.Create('error');
except
on E: TMyException do
begin
E.Message := Format('reraise %s', [E.Message]);
raise;
end;
end;
--
Regards, LVT.
Юрий Зотов (2008-06-15 11:27:00) [7]> Loginov Dmitry © (15.06.08 10:45) [12]
1. За такоея ругать не мог (потому что это самый обычный способ "ручного" отслеживания и ругать тут не за что). А вот за что-то, хотя внешне и похожее, но по сути другое- мог.
2. Зачем пересоздавать объект исключения, если можно просто изменить его Message?
Loginov Dmitry (2008-06-15 10:45:00) [8]> Дык... а что ж тут некорректного? Все нормально.
Юрий, раньше Вы меня за такое ругали. А теперь это корректно? ;)
Сам обычно использую такую конструкцию:
function ReCreateEObject(E: Exception; const FuncName: string): Exception;
var
S: string;
begin
S := Format('%s -> %s', [FuncName, E.Message]);
Result := ExceptClass(E.ClassType).Create(S);
end;
try
......................
except
on E: Exception do
begin
................
raise ReCreateEObject(E, 'MyFunc');
end;
end;
Германн (2008-06-15 01:31:00) [9]
> Германн © (15.06.08 01:23) [10]
>
>
> > Юрий Зотов © (14.06.08 21:37) [8]
>
> На E.ClassName ругается, зараза.
>
Был не прав. Не ругается и не зараза.
:)
Германн (2008-06-15 01:23:00) [10]
> Юрий Зотов © (14.06.08 21:37) [8]
На E.ClassName ругается, зараза.
Игорь Шевченко (2008-06-14 23:28:00) [11]можно и без on, через ExceptObject
Юрий Зотов (2008-06-14 21:37:00) [12]> YurikGL © (14.06.08 20:49) [7]
Дык... а что ж тут некорректного? Все нормально.
Совет - посмотрите в сторону Assert, бывает очень полезно. Дело в том, что сообщение EAssertionFailed содержит имя модуля и номер строки. То есть, для локализации ошибки можно использовать что-то типа этого:
on E: Exception do
Assert(false, 'Ошибка ' + E.ClassName + ': ' + E.Message);
YurikGL (2008-06-14 20:49:00) [13]
> Гы... и верно ведь... позор на мои седины... :o)
Вопрос, как к мастеру... насколько корректно
raise Exception.Create('Ошибка в разтаком-то модуле '+e.Message);в секции except?
Я использую эту конструкцию для "вытаскивания" всей цепочки ошибок. Т.е. если одна функция вызывает другую, та - третью и т.д. выйдет весь текст ошибки по цепочке.
Юрий Зотов (2008-06-14 20:06:00) [14]> YurikGL © (14.06.08 19:40) [5]
Гы... и верно ведь... позор на мои седины... :o)
YurikGL (2008-06-14 19:40:00) [15]
> А On здесь зачем?
Иначе undeclared identifier: 'e'
Юрий Зотов (2008-06-14 19:36:00) [16]А On здесь зачем?
YurikGL (2008-06-14 19:30:00) [17]Че нить типа такого
try
....
except
on e:exception do
begin
MLog.Lines.Add('Ошибка вышла '+#+e.Message);
raise Exception.Create('Ошибка в разтаком-то модуле '+e.Message);
end;
end;
Вообщем Я! (2008-06-14 19:30:00) [18]try
except On E:Exception
Memo1.Lines.Add (E.Message)
end
AndreyV (2008-06-14 19:19:00) [19]Ну и ищи в хелпе по этим ключевым словам. Находится за секунды и с примером.