![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработать ошибку пинга [D7, XP]
Tornado © (2009-11-18 08:51:00)Подскажите пожалуйста, моя программа при запуске пингует удаленный компьютер (в процессе работы она должна обмениваться данными с ним). Если по каким-то причинам комп на котором установили программу не подключен к сети или сеть не работает (в нашей огромной конторе такое к сожалению бывает, потом спохватятся, сеть настроят) то прога выдает ошибку "Socet Error.No route to host" что вообщемто и понятно. Вопрос в том как бы "красиво обработать" эту ошибку чтобы не получать это сообщение, а допустим в статусной строке писать "Нет соединения с сревером". А то юзеры очень пугаются таких ошибок :)
kyn66 (2009-11-18 11:33:00) [21]
> 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;
Anatoly Podgoretsky (2009-11-18 11:31:00) [22]
> Я использую IdIcmpClient
Вроде бы этот как раз работает с ErrorCode
Anatoly Podgoretsky (2009-11-18 11:30:00) [23]
> Этот обработчик будет обрабатывать все исключения приложения?
Конечно и это плохо.
Anatoly Podgoretsky (2009-11-18 11:28:00) [24]
> Из слов автора вытекает, что пользователей пугает именно
> окно ошибки с краснвм крестом. А вот чтобы оно не появлялось
> как раз таки и нужно сделать свою мякгую обработку через
> перехват исключений. Чего гадать. Давайте дождемся что автор
> скажет по этому поводу.
А у меня другое впечатление, например что пугает именно то сообщение, на англиском языке, но я же не стал называть твои сообщения ехидными, хотя между ними нет никакой разницы.
Anatoly Podgoretsky (2009-11-18 11:26:00) [25]
> Tornado (18.11.09 10:34) [10]
Ну кто его знает, твой вопрос не аккуратно построен, а благодарил ты зря, код неверный и подход тоже. Для ответа надо выдать гораздо больше информации, чем ты выдал.
DVM (2009-11-18 11:24:00) [26]
> Нужно убедиться что удаленный компьютер доступен.
Доступен для чего? Если нужно проверить, доступен ли компьютер по определенному протоколу и порту - вот и проверяй по этому протоколу и порту. Хотя все равно это сомнительная пользя - через миг после проверки он становится недоступен и дальше что? Доступность или недоступность она определяется в момент работы с узлом.
Tornado (2009-11-18 11:05:00) [27]
> Сергей М. © (18.11.09 10:50) [14]
Может подскажете как это правильно реализовать? Нужно убедиться что удаленный компьютер доступен. Какие еще есть способы?
Сергей М. (2009-11-18 10:59:00) [28]
> brother © (18.11.09 10:54) [16]
Совершенно верно.
Или, что тоже немаловероятно, маршрутизатор/файрвол на одном из хостов на потенциальном маршруте между А и В попросту блокирует форвардинг icmp-пакетов от А до В и/или в обратном направлении.
brother (2009-11-18 10:54:00) [29]> То что удаленный хост не ответил на твой ICMP-эхо-запрос,
> вовсе не означает что он не доступен, и уж тем более что
> с ним "нет соединения".
от может принимать подключения, например http, но не отвечать на эхо запросы вообще.
Сергей М. (2009-11-18 10:50:00) [30]
> Этот обработчик будет обрабатывать все исключения приложения?
Нет.
Сергей М. (2009-11-18 10:50:00) [31]
> Нет соединения с сревером
То что удаленный хост не ответил на твой ICMP-эхо-запрос, вовсе не означает что он не доступен, и уж тем более что с ним "нет соединения".
Короче полную ерунду ты реализуешь.
Tornado (2009-11-18 10:49:00) [32]
> kyn66 © (18.11.09 09:25) [2]
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := MyExcept;
end;
Этот обработчик будет обрабатывать все исключения приложения?
Tornado (2009-11-18 10:36:00) [33]Вот код (прошу не бить сильно, чесно нарыл в инете, если он совсем кривой прошу поправить)
IdIcmpClient1.Host := IniParam.ReadString('ServerIP', 'ServerHostIP',
'');
IdIcmpClient1.Ping();
if IdIcmpClient1.ReceiveTimeout >= 30000 then
begin
Exit;
end
else......
Tornado (2009-11-18 10:34:00) [34]
> Leonid Troyanovsky © (18.11.09 09:38) [5]
Я использую IdIcmpClient
Tornado (2009-11-18 10:34:00) [35]
> Anatoly Podgoretsky © (18.11.09 09:06) [1]
Анатолий, с выводом сообщения в статусстроке я разобрался несколько лет назад :))
Tornado (2009-11-18 10:33:00) [36]
> kyn66 © (18.11.09 09:25) [2]
Спасибо!
kyn66 (2009-11-18 09:59:00) [37]
> именно такой текст, что бы не пугать другим.
Из слов автора вытекает, что пользователей пугает именно окно ошибки с краснвм крестом. А вот чтобы оно не появлялось как раз таки и нужно сделать свою мякгуюобработку через перехват исключений. Чего гадать. Давайте дождемся что автор скажет по этому поводу.
Anatoly Podgoretsky (2009-11-18 09:45:00) [38]
> Leonid Troyanovsky © (18.11.09 09:38) [5]
Вероятность близка к 100%, поскольку отсутствие пинга это не ошибка, а одно из нормальных состояний. Ошибка когда нет соединения.
app (2009-11-18 09:42:00) [39]
> Я думаю StatusBar.SimpleText := 'Нет соединения с сревером';
> и 0-классник додумался бы написать.
Что поделаешь, если автор пишет в твоем репертуара, но он четко спросил как вывести, именно такой текст, что бы не пугать другим.
Leonid Troyanovsky (2009-11-18 09:38:00) [40]
> kyn66 © (18.11.09 09:25) [2]
> написать. А вот человеку нужно было посоветовать перехватить
> системную ошибку и вывести своим сообщением... чтобы красиво
Написанное тобой может быть и вовсе зряшным, если,
вопрошающий пользует, например, TTcpClient, или
нечто в этом роде, с обработчиком OnError и ErrorCode.
--
Regards, LVT.