Главная страница
    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.48 MB
Время: 0.043 c
15-1185515813
Vlad Oshin
2007-07-27 09:56
2007.08.26
Что-то вот подумалось. Подавить ошибки, кто-то когдато спрашивал


6-1168716280
MyJIbT
2007-01-13 22:24
2007.08.26
Изменения IP


15-1185785892
click
2007-07-30 12:58
2007.08.26
плавный скроллинг TScrollBox


15-1185444219
Иксик
2007-07-26 14:03
2007.08.26
Клиент для VSS


15-1185207715
Aleksandre
2007-07-23 20:21
2007.08.26
Требуется программист на работу





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский