Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Вниз

Обработать ошибку пинга   Найти похожие ветки 

 
Tornado   (2009-11-18 08:51) [0]

Подскажите пожалуйста, моя программа при запуске пингует удаленный компьютер (в процессе работы она должна обмениваться данными с ним). Если по каким-то причинам комп на котором установили программу не подключен к сети или сеть не работает (в нашей огромной конторе такое к сожалению бывает, потом спохватятся, сеть настроят) то прога выдает ошибку "Socet Error.No route to host" что вообщемто и понятно. Вопрос в том как бы "красиво обработать" эту ошибку чтобы не получать это сообщение, а допустим в статусной строке писать "Нет соединения с сревером". А то юзеры очень пугаются таких ошибок :)


 
Anatoly Podgoretsky ©   (2009-11-18 09:06) [1]

> Tornado  (18.11.2009 08:51:00)  [0]

Красиво, это когда будет всплывать видео с голой теткой, которая будет томно говорить, Торнадик, а сеть то упала, ты бы не мог ее поправить.
Ну и не шутливый ответ, с выводом в статусную строку

StatusBar.SimpleText := "Нет соединения с сревером";


 
kyn66 ©   (2009-11-18 09:25) [2]


> Anatoly Podgoretsky ©   (18.11.09 09:06) [1]
> > Tornado  (18.11.2009 08:51:00)  [0]Красиво, это когда
> будет всплывать видео с голой теткой, которая будет томно
> говорить,


Да, АП как всегда в своем репертуаре, вместо вразумительного ответа ехидное сравнение... Я думаю StatusBar.SimpleText := "Нет соединения с сревером"; и 0-классник додумался бы написать. А вот человеку нужно было посоветовать перехватить системную ошибку и вывести своим сообщением... чтобы красиво было

procedure TForm1.FormCreate(Sender: TObject);
begin
 Application.OnException := MyExcept;
end;

Procedure TForm1.MyExcept(Sender:TObject; E:Exception);
begin
 If E is E....Error then
   MessageDlg("Красиво обрабатываю ошибку", mtInformation, [mbOk], 0)
 else
   { если это не та ошибка, которую вы ищете,
     передайте на обработку дальше }
end;

Написать конкретный класс ошибки.


 
kyn66 ©   (2009-11-18 09:26) [3]

Удалено модератором


 
kyn66 ©   (2009-11-18 09:29) [4]

Удалено модератором


 
Leonid Troyanovsky ©   (2009-11-18 09:38) [5]


> kyn66 ©   (18.11.09 09:25) [2]

> написать. А вот человеку нужно было посоветовать перехватить
> системную ошибку и вывести своим сообщением... чтобы красиво

Написанное тобой может быть и вовсе зряшным, если,
вопрошающий пользует, например, TTcpClient, или
нечто в этом роде, с обработчиком OnError и ErrorCode.

--
Regards, LVT.


 
app ©   (2009-11-18 09:42) [6]


> Я думаю StatusBar.SimpleText := "Нет соединения с сревером";
>  и 0-классник додумался бы написать.

Что поделаешь, если автор пишет в твоем репертуара, но он четко спросил как вывести, именно такой текст, что бы не пугать другим.


 
Anatoly Podgoretsky ©   (2009-11-18 09:45) [7]


> Leonid Troyanovsky ©   (18.11.09 09:38) [5]

Вероятность близка к 100%, поскольку отсутствие пинга это не ошибка, а одно из нормальных состояний. Ошибка когда нет соединения.


 
kyn66 ©   (2009-11-18 09:59) [8]


> именно такой текст, что бы не пугать другим.


Из слов автора вытекает, что пользователей пугает именно окно ошибки с краснвм крестом. А вот чтобы оно не появлялось как раз таки и нужно сделать свою мякгую обработку через перехват исключений. Чего гадать. Давайте дождемся что автор скажет по этому поводу.


 
Tornado   (2009-11-18 10:33) [9]


> kyn66 ©   (18.11.09 09:25) [2]

Спасибо!


 
Tornado   (2009-11-18 10:34) [10]


> Anatoly Podgoretsky ©   (18.11.09 09:06) [1]

Анатолий, с выводом сообщения в статусстроке я разобрался несколько лет назад :))


 
Tornado   (2009-11-18 10:34) [11]


> Leonid Troyanovsky ©   (18.11.09 09:38) [5]

Я использую IdIcmpClient


 
Tornado   (2009-11-18 10:36) [12]

Вот код (прошу не бить сильно, чесно нарыл в инете, если он совсем кривой прошу поправить)


IdIcmpClient1.Host := IniParam.ReadString("ServerIP", "ServerHostIP",
     "");
   IdIcmpClient1.Ping();
   if IdIcmpClient1.ReceiveTimeout >= 30000 then
   begin
     Exit;
   end
   else......


 
Tornado   (2009-11-18 10:49) [13]


> kyn66 ©   (18.11.09 09:25) [2]


procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := MyExcept;
end;

Этот обработчик будет обрабатывать все исключения приложения?


 
Сергей М. ©   (2009-11-18 10:50) [14]


> Нет соединения с сревером


То что удаленный хост не ответил на твой ICMP-эхо-запрос, вовсе не означает что он не доступен, и уж тем более что с ним "нет соединения".

Короче полную ерунду ты реализуешь.


 
Сергей М. ©   (2009-11-18 10:50) [15]


> Этот обработчик будет обрабатывать все исключения приложения?


Нет.


 
brother ©   (2009-11-18 10:54) [16]

> То что удаленный хост не ответил на твой ICMP-эхо-запрос,
> вовсе не означает что он не доступен, и уж тем более что
> с ним "нет соединения".

от может принимать подключения, например http, но не отвечать на эхо запросы вообще.


 
Сергей М. ©   (2009-11-18 10:59) [17]


> brother ©   (18.11.09 10:54) [16]


Совершенно верно.
Или, что тоже немаловероятно, маршрутизатор/файрвол на одном из хостов на потенциальном маршруте между А и В попросту блокирует форвардинг icmp-пакетов от А до В и/или в обратном направлении.


 
Tornado   (2009-11-18 11:05) [18]


> Сергей М. ©   (18.11.09 10:50) [14]

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


 
DVM ©   (2009-11-18 11:24) [19]


> Нужно убедиться что удаленный компьютер доступен.

Доступен для чего? Если нужно проверить, доступен ли компьютер по определенному протоколу и порту - вот и проверяй по этому протоколу и порту. Хотя все равно это сомнительная пользя - через миг после проверки он становится недоступен и дальше что? Доступность или недоступность она определяется в момент работы с узлом.


 
Anatoly Podgoretsky ©   (2009-11-18 11:26) [20]


> Tornado   (18.11.09 10:34) [10]

Ну кто его знает, твой вопрос не аккуратно построен, а благодарил ты зря, код неверный и подход тоже. Для ответа надо выдать гораздо больше информации, чем ты выдал.


 
Anatoly Podgoretsky ©   (2009-11-18 11:28) [21]


> Из слов автора вытекает, что пользователей пугает именно
> окно ошибки с краснвм крестом. А вот чтобы оно не появлялось
> как раз таки и нужно сделать свою мякгую обработку через
> перехват исключений. Чего гадать. Давайте дождемся что автор
> скажет по этому поводу.

А у меня другое впечатление, например что пугает именно то сообщение, на англиском языке, но я же не стал называть твои сообщения ехидными, хотя между ними нет никакой разницы.


 
Anatoly Podgoretsky ©   (2009-11-18 11:30) [22]


> Этот обработчик будет обрабатывать все исключения приложения?

Конечно и это плохо.


 
Anatoly Podgoretsky ©   (2009-11-18 11:31) [23]


> Я использую IdIcmpClient

Вроде бы этот как раз работает с ErrorCode


 
kyn66 ©   (2009-11-18 11:33) [24]


> Tornado   (18.11.09 10:49) [13]


Нет, нужно подставить класс конкретно проверяемой ошибки. В "Страшном окне написано будет". Можно оформить через блок
try
...
except
...
end

begin
  try
    // нечто выполняем...
  except
    // возникла ошибка - реагируем
    on E...Error do
      ShowMessage("Красивое повествование об ошибке");
    on E...Error do  // другой предполагаемый вид ошибки
      ShowMessage("Некая другая ошибка");
    else // если ничего не прокатило
      Application.HandleException(Sender) // во всех остальных случаях
    end;


 
Германн ©   (2009-11-18 11:33) [25]

<offtop>
Чем-то мне этот сабж напоминает вопрос "Как узнать есть ли связь с базой до подключения к ней?"
</offtop>


 
brother ©   (2009-11-18 11:59) [26]

согласен с [20] и пока с [25]


 
Anatoly Podgoretsky ©   (2009-11-18 11:59) [27]

> kyn66  (18.11.2009 11:33:24)  [24]

А не устанешь подставлять для всех ошибок то?


 
Сергей М. ©   (2009-11-18 12:09) [28]


> как это правильно реализовать? Нужно убедиться что удаленный
> компьютер доступен


Доступность компьютера - это нонсенс.
Говоря о доступности следует говорить не о компьютере, а о конкретном сервисе, потенциально предоставлямом компьютером.

Если тебя интересует, например, некий прикладной сервис (например, http), то и проверять на доступность следует именно его. А для этого следует обратиться к компьютеру по соответствующему прикладному протоколу, например, успешно послать http-запрос и успешно же получить http-ответ на этот запрос.


 
sniknik ©   (2009-11-18 12:11) [29]

> kyn66 ©   (18.11.09 11:33) [24]
глупости советуешь... заменять целый класс разнообразных ошибок одним "красивым повествованием"...
такие программы ОЧЕНЬ сложны в поддержке (т.е. в серьезной фирме с цто, отвечающей,и поддерживающей свои программы за такой код могут даже уволить... во всяком случае цто при рецидивах будет на этом настаивать).
хуже может быть только когда все ошибки заменяются одним сообщением. типа "а зато по русски".
и еще хуже когда ошибки скрываются, типа ничего не произошло.


 
kyn66 ©   (2009-11-18 12:23) [30]

Это как вариант. А никто не утверждал что он единственный.


 
Сергей М. ©   (2009-11-18 12:25) [31]


> kyn66 ©   (18.11.09 11:33) [24]
>
>


Код этот абсолютно непригоден для использования в доп.потоке.
Равно как и обработка события Application.OnException не позволяет перехватить исключения, возникающие в доп.потоках.


 
kyn66 ©   (2009-11-18 12:32) [32]


> Anatoly Podgoretsky ©   (18.11.09 11:31) [23]
> > Я использую IdIcmpClientВроде бы этот как раз работает
> с ErrorCode

Как раз у этого компонента нету упоминания о событии, связанного с ErrorCode


 
Tornado   (2009-11-18 12:47) [33]


> Сергей М. ©   (18.11.09 12:09) [28]

Да согласен, не получается у меня правильно и понятно формулировать вопросы (( Вообщем программа периодически добавляет некие данные на удаленном компе (Firebird через FIB компоненты). Я к чему все это затеял, мне бы хотелось чтобы при запуске приложения какм-либо образом понять доступна БД или нет (уточняю). Понимаю что сейчас она доступна а через секекунду нет потому что сбой произошел или кабель порвали, но это частные случаи и происходят они слава Богу не часто.

Первое что пришло на ум - пинговать при запуске приложения удаленный комп. Я не говорю что это правильно, если есть варианты (а они безусловно есть) рад был бы о них услышать


 
Anatoly Podgoretsky ©   (2009-11-18 12:57) [34]

> kyn66  (18.11.2009 12:32:32)  [32]

Я не знаю, по этому использовано слово "Вроде", что означает как может быть, так и ошибаюсь.


 
Anatoly Podgoretsky ©   (2009-11-18 12:59) [35]

> Tornado  (18.11.2009 12:47:33)  [33]

Ну так единственный вариант, это спросить явно, сделав какой либо запрос. А вот пинговать - это совсем не правильно, поскольку не дает никакого ответа, кроме слычая, что пинг работает.


 
Сергей М. ©   (2009-11-18 13:54) [36]


> это частные случаи и происходят они слава Богу не часто


Но обрабатывать-то их все равно следует ..

А если ты их обрабатываешь должным образом, то и проблема сама собой рассасывается..

А раз рассасывается, то и пятое колесо (ping) этой телеге не нужно


 
Александр З.   (2009-11-23 21:48) [37]


procedure TForm1.Timer1Timer(Sender: TObject);
begin
IdIcmpClient1.Host :="10.1.1.5";
IdIcmpClient1.Ping;
IdIcmpClient1.ReceiveTimeout:=500;
if IdIcmpClient1.ReplyStatus.TimeToLive <>0 then
 memo1.Lines.Add("Есть пинг!")
else
 memo1.Lines.Add(Нет пинга!")
end;

Ребята подскажите, если в случае пропадания соединения с сервером, как мне поставить исключение, вернее порядок (try...exception)?


 
Александр З.   (2009-11-23 21:50) [38]

В дополнение к предыдущему. Забыл добавить, что возникает ошибка, в случае длительного отсутствия пинга до данного сервера. Как ее поставить в исключения?


 
Anatoly Podgoretsky ©   (2009-11-23 21:57) [39]

> Александр З.  (23.11.2009 21:50:38)  [38]

Может быть ты про Raise говоришь, но не понятно.


 
Александр З.   (2009-11-23 22:02) [40]


> Anatoly Podgoretsky

Я извиняюсь, а пример его реализации Вы смогли бы показать на примере моего кода. Спасибо Анатолий.



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

Форум: "Начинающим";
Текущий архив: 2010.01.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.009 c
4-1226580293
DevilDevil
2008-11-13 15:44
2010.01.17
Bitmap, 8bit. Серая палитра.


6-1211794870
PES
2008-05-26 13:41
2010.01.17
Почему Clientsocket на одних компах коннектится, а на других нет?


15-1251621324
NailMan
2009-08-30 12:35
2010.01.17
Зацените видео полета "FPV"


2-1258818660
Wito
2009-11-21 18:51
2010.01.17
Рекурсивный обход дерева


8-1200143658
452
2008-01-12 16:14
2010.01.17
Как вывести текст в центре Canvas по вертикали и горизонтали?





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