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

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

Как убрать сообщения об ошибках [D7, XP]


Ануфрий ©   (2007-08-03 19:30:00) 

С некоторых пор Дельфи стал показывать сообщения об ошибках (исключениях), которые пойманы через try.

Т.е. код до этого
try
 I := деление на ноль;
finally
end

Приводил к тому, что в режиме отладки дельфи сообщал об ошибке, и после нажатия F9 программа дальше работала. Без дельфи прога вообще ничего не выдавала.
Теперь показывается сообщение дельфи и после F9 вылетает MessageBox.
А если запускать без дельфи, то просто вылетает MessageBox (типа деление на ноль).
Раньше все было нормально, не пойму что случилось и как это убрать.


Anatoly Podgoretsky   (2007-08-03 20:23:00) [1]

> Ануфрий  (03.08.2007 20:10:17)  [17]

Вот это грамотный код.


Ануфрий   (2007-08-03 20:10:00) [2]

Все, спасибо всем, просто заработался.


function GetBody(const URL: string): string;
var
 HTTP: TIdHTTP;
 Str: string;
begin
 Result := '';
 HTTP := TIdHTTP.Create(nil);
 try
   Result := HTTP.Get(' http://my_domain.com');
 finally
   HTTP.Free;
 end;
end;

а далее вызов так

 try
   S := GetBody(' http://domain.com');
 except
   S := '';
 end;


потому ошибки не было. А когда я начал разбираться с GetBody, видел только finally и это меня смутило, почему вдруг стали ошибки появляться. :)


Anatoly Podgoretsky   (2007-08-03 20:08:00) [3]

> Anatoly Podgoretsky  (03.08.2007 20:01:15)  [15]

Хотя бы на

except
  on E.Exception do begin
//     variable := E.Message
//или
//     LOG(llCriticalLevel, 'Ошибка HTTP.Get( http://my_domain.com) = ' + E.Message);
  end;
end

Это позволит как минимум поставить точку останова для отладки.


Anatoly Podgoretsky   (2007-08-03 20:01:00) [4]

> Ануфрий  (03.08.2007 19:52:09)  [9]

Для данного кода можно написать с одним блоком, но обычно код сложнее и

except
end

Лучше заменить на

except
 что то полезное.
end


Инс   (2007-08-03 19:58:00) [5]


> [10] Ануфрий   (03.08.07 19:56)

Почитай Рихтера, у него отлично механизм исключений расписан.


{RASkov}   (2007-08-03 19:58:00) [6]

> [9] Ануфрий   (03.08.07 19:52)
> Тогда наверное проще заменить на
> var
> HTTP: TIdHTTP;
> Str: string;
> begin
> HTTP := TIdHTTP.Create(nil);
> try
>   Str := HTTP.Get(' http://my_domain.com');
> except
> end;
> HTTP.Free;
> end;
> ?

Не верно!

var
HTTP: TIdHTTP;
Str: string;
begin
 HTTP := TIdHTTP.Create(nil);
 try
  try
   Str := HTTP.Get(' http://my_domain.com');
  except
   ShowMessage('Произошла ошибка такая-то');
  end;
 finally
  HTTP.Free;
 end;
end;


Инс   (2007-08-03 19:57:00) [7]


> Тогда наверное проще заменить на

В данном конкретном случае можно, но вообще лучше 1-й вариант.


Zagaevskiy   (2007-08-03 19:57:00) [8]

Может ошибок там не было?


Ануфрий   (2007-08-03 19:56:00) [9]

Посмотрел старый код. Раньше у меня тоже было try finally end. И никогда ошибки на экран не выдавались.


Ануфрий   (2007-08-03 19:52:00) [10]

Anatoly Podgoretsky
Так нужно делать вложенные try что-ли?
var
HTTP: TIdHTTP;
Str: string;
begin
HTTP := TIdHTTP.Create(nil);
try
  try
    Str := HTTP.Get(' http://my_domain.com');
  except
  end;
finally
  HTTP.Free;
end;
end;


Тогда наверное проще заменить на
var
HTTP: TIdHTTP;
Str: string;
begin
 HTTP := TIdHTTP.Create(nil);
 try
   Str := HTTP.Get(' http://my_domain.com');
 except
 end;
 HTTP.Free;
end;

?


Ануфрий   (2007-08-03 19:49:00) [11]

Dib@zol
Спасибо, работает. Хотя я всегда думал, что finally также "поглощает" ошибки, как except, только в отличие от последнего вызывается всегда, даже если ошибок нет. И вроде бы так и работало... Может просто не разу ошибок не попадалось внутри try finally end;


Anatoly Podgoretsky   (2007-08-03 19:46:00) [12]

> Dib@zol  (03.08.2007 19:43:05)  [5]

try..finally убирать нельзя, это будет уже другая ошибка дизайна, например утечка как минимум


Anatoly Podgoretsky   (2007-08-03 19:45:00) [13]

> Ануфрий  (03.08.2007 19:42:04)  [4]

Чтобы на экран не выдавалось сообщение, исключение надо обработать самому, это блок try except end


Dib@zol   (2007-08-03 19:43:00) [14]

var
HTTP: TIdHTTP;
Str: string;
begin
HTTP := TIdHTTP.Create(nil);
try
  Str := HTTP.Get(' http://my_domain.com');
finally
  HTTP.Free;
end;
end;

try..finally заменяй на try..except.


Ануфрий   (2007-08-03 19:42:00) [15]

Ну тогда другой пример.

var
 HTTP: TIdHTTP;
 Str: string;
begin
 HTTP := TIdHTTP.Create(nil);
 try
   Str := HTTP.Get(' http://my_domain.com');
 finally
   HTTP.Free;
 end;
end;


При запуске вызывается исключение (сайт не найден). Мне нужно чтобы на экран не выдавалось сообщение с текстом исключения.


Anatoly Podgoretsky   (2007-08-03 19:39:00) [16]

> Ануфрий  (03.08.2007 19:35:02)  [2]

В этом примере не делить на ноль.


Ануфрий   (2007-08-03 19:35:00) [17]

Это пример.


Dib@zol   (2007-08-03 19:32:00) [18]

А может просто не делить на ноль???Или это просто такой пример?


Наверх

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