Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.07.13;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
11-1172648216
Trible
2007-02-28 10:36
2008.07.13
Glyph для GrushButton


11-1191803763
Jon
2007-10-08 04:36
2008.07.13
msg.result?


2-1213112363
Кпрф
2008-06-10 19:39
2008.07.13
Копирование


3-1201989045
md10
2008-02-03 00:50
2008.07.13
существование поля


2-1213185672
snake-as
2008-06-11 16:01
2008.07.13
Просто удалить запись