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

Вниз

Как убрать сообщения об ошибках   Найти похожие ветки 

 
Ануфрий   (2007-08-03 19:30) [0]

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

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

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


 
Dib@zol ©   (2007-08-03 19:32) [1]

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


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

Это пример.


 
Anatoly Podgoretsky ©   (2007-08-03 19:39) [3]

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

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


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

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

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


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


 
Dib@zol ©   (2007-08-03 19:43) [5]

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.


 
Anatoly Podgoretsky ©   (2007-08-03 19:45) [6]

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

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


 
Anatoly Podgoretsky ©   (2007-08-03 19:46) [7]

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

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


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

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


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

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:56) [10]

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


 
Zagaevskiy ©   (2007-08-03 19:57) [11]

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


 
Инс ©   (2007-08-03 19:57) [12]


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

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


 
{RASkov} ©   (2007-08-03 19:58) [13]

> [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:58) [14]


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

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


 
Anatoly Podgoretsky ©   (2007-08-03 20:01) [15]

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

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

except
end

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

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


 
Anatoly Podgoretsky ©   (2007-08-03 20:08) [16]

> 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

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


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

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


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:23) [18]

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

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



Страницы: 1 вся ветка

Текущий архив: 2007.08.26;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
9-1155485737
Kav
2006-08-13 20:15
2007.08.26
ODE составная геометрия


15-1185875690
AZIZE
2007-07-31 13:54
2007.08.26
Интернет


2-1185809622
pukin
2007-07-30 19:33
2007.08.26
Parent для WebBrowsera


2-1185777100
johntemp
2007-07-30 10:31
2007.08.26
TExcelApplication в Delphi 3?


15-1185429631
record
2007-07-26 10:00
2007.08.26
Record