Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Внизtry .. exception - как вывести сообщение самой ошибки Найти похожие ветки
← →
WebSQLNeederrr (2008-06-14 19:09) [0]с помощью конструкции try .. exceprion можно экранировать ошибки, а как вывести сообщение об ошибке, скажем в Мемо?
← →
AndreyV © (2008-06-14 19:19) [1]Ну и ищи в хелпе по этим ключевым словам. Находится за секунды и с примером.
← →
Вообщем Я! (2008-06-14 19:30) [2]try
except On E:Exception
Memo1.Lines.Add (E.Message)
end
← →
YurikGL © (2008-06-14 19:30) [3]Че нить типа такого
try
....
except
on e:exception do
begin
MLog.Lines.Add("Ошибка вышла "+#+e.Message);
raise Exception.Create("Ошибка в разтаком-то модуле "+e.Message);
end;
end;
← →
Юрий Зотов © (2008-06-14 19:36) [4]А On здесь зачем?
← →
YurikGL © (2008-06-14 19:40) [5]
> А On здесь зачем?
Иначе undeclared identifier: "e"
← →
Юрий Зотов © (2008-06-14 20:06) [6]> YurikGL © (14.06.08 19:40) [5]
Гы... и верно ведь... позор на мои седины... :o)
← →
YurikGL © (2008-06-14 20:49) [7]
> Гы... и верно ведь... позор на мои седины... :o)
Вопрос, как к мастеру... насколько корректноraise Exception.Create("Ошибка в разтаком-то модуле "+e.Message);
в секции except?
Я использую эту конструкцию для "вытаскивания" всей цепочки ошибок. Т.е. если одна функция вызывает другую, та - третью и т.д. выйдет весь текст ошибки по цепочке.
← →
Юрий Зотов © (2008-06-14 21:37) [8]> YurikGL © (14.06.08 20:49) [7]
Дык... а что ж тут некорректного? Все нормально.
Совет - посмотрите в сторону Assert, бывает очень полезно. Дело в том, что сообщение EAssertionFailed содержит имя модуля и номер строки. То есть, для локализации ошибки можно использовать что-то типа этого:on E: Exception do
Assert(false, "Ошибка " + E.ClassName + ": " + E.Message);
← →
Игорь Шевченко © (2008-06-14 23:28) [9]можно и без on, через ExceptObject
← →
Германн © (2008-06-15 01:23) [10]
> Юрий Зотов © (14.06.08 21:37) [8]
На E.ClassName ругается, зараза.
← →
Германн © (2008-06-15 01:31) [11]
> Германн © (15.06.08 01:23) [10]
>
>
> > Юрий Зотов © (14.06.08 21:37) [8]
>
> На E.ClassName ругается, зараза.
>
Был не прав. Не ругается и не зараза.
:)
← →
Loginov Dmitry © (2008-06-15 10:45) [12]> Дык... а что ж тут некорректного? Все нормально.
Юрий, раньше Вы меня за такое ругали. А теперь это корректно? ;)
Сам обычно использую такую конструкцию: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 11:27) [13]> Loginov Dmitry © (15.06.08 10:45) [12]
1. За такое я ругать не мог (потому что это самый обычный способ "ручного" отслеживания и ругать тут не за что). А вот за что-то, хотя внешне и похожее, но по сути другое - мог.
2. Зачем пересоздавать объект исключения, если можно просто изменить его Message?
← →
Leonid Troyanovsky © (2008-06-15 11:52) [14]
> 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.
← →
Loginov Dmitry © (2008-06-15 17:42) [15]to [13], [14]
для системных исключений нельзая изменить текст. Изменение текста катит только для родных дельфийский эксепшенов.
← →
Leonid Troyanovsky © (2008-06-15 18:00) [16]
> Loginov Dmitry © (15.06.08 17:42) [15]
> Изменение текста катит только для родных дельфийский эксепшенов.
В дельфи иных исключений и нет.
--
Regards, LVT.
← →
Loginov Dmitry © (2008-06-15 18:05) [17]> В дельфи иных исключений и нет.
Я вот про что: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 19:17) [18]
> Loginov Dmitry © (15.06.08 18:05) [17]
> Куда reraise девается? То-то же!
Ну и не надо никаких on E: Exception.
Если обработчику неизвестно исключение -
он _обязан_ его пропустить.
--
Regards, LVT.
← →
Игорь Шевченко © (2008-06-15 19:19) [19]
> except
> on E: Exception do
> begin
> E.Message := Format("reraise %s", [E.Message]);
> raise;
> end;
> end;
За такой код надо давить
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.07.13;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.008 c