Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1213355939
Namos
2008-06-13 15:18
2008.07.13
Delphi+mysql


15-1212260211
Proof
2008-05-31 22:56
2008.07.13
Не понятно, что с хелпом


15-1212158236
dr_creigan
2008-05-30 18:37
2008.07.13
Интернет-трафик


2-1213242326
Toropov
2008-06-12 07:45
2008.07.13
Как организовать помощь (Help) в своей программе?


15-1211889596
map
2008-05-27 15:59
2008.07.13
Какрта в программе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский