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

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

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]

Ну и ищи в хелпе по этим ключевым словам. Находится за секунды и с примером.


Наверх

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