Procedura testująca połączenie z Internetem - błąd "Host not found"

0

Witam.

Próbuje w aplikacji (w Lazarusie) zrobić procedurę testującą połączenie z Internetem.
Wstawiłem do timera taki kod:

      Form1.IdIcmpClient1.Host:='www.google.pl';
      Form1.IdIcmpClient1.Ping('xxx');
      Form1.IdIcmpClient1.ReceiveTimeout:=100;
      IF Form1.IdIcmpClient1.ReplyStatus.BytesReceived=0
      THEN Form1.Label1.Caption:='Połączenie OK'
      ELSE Form1.Label1.Caption:='Brak połączenia'
 

W sytuacji gdy uruchomię aplikację w chwili gdy mam dostęp do internetu i w czasie działania programu Internet odepnę wszystko działa zgodnie z oczekiwaniami (label1 pokazuje "brak połączenia") po ponownym podłączeniu kabelka od LAN label1 zmienia się na "połączenie OK".

Jednak gdy próbuje uruchomić aplikację w chwili gdy nie ma internetu zwraca mi błąd "host not found".

Dlaczego ? (teoretycznie w chwili odpięcia komputera od sieci też powinienem dostać taki komunikat).
Jak temu zapobiec?

Pozdrawiam i dziękuję

EDIT


Pomijając wyżej opisany problem spróbowałem nawiązac połączenie z seewerem FTP.
Wklepałem :

IdFTP1.Port := 21;
IdFTP1.Username :='USER_NAME';
IdFTP2.Password := 'PASSWORD';
IdFTP1.Host := 'HOST';
TRY
   POMOC.IdFTP1.Connect;
FINALLY
END;   
 

O ile w miejsce Host wpisze poprawny adres serwera jest ok.
Jednak przy wpisaniu błędnego adresu wywala błąd (znów Host not found).
Dlaczego TRY nie wyłapuje tego wyjątku ?

1

Dlaczego TRY nie wyłapuje tego wyjątku ?

@hipekk - a od kiedy to blok try finally służy do wyłapywania wyjątków..?

Po pierwsze to fakt - on wyjątków nie wyłapuje, bo robi to blok try except, a po drugie zamieniając blok na właściwy i tak go nie obsługujesz;

Powinno być tak:

try
   Pomoc.IdFTP1.Connect;
except
  // tutaj wyłapanie wyjątku i zareagowanie na jego zaistnienie (jeśli jest taka potrzeba)
end;

Zapoznaj się z poniższymi tekstami:

A przerabiając kod testowy łączący z serwerem FTP - powinien wyglądać mniej więcej tak:

with IdFTP1 do
try
  Port := 21;
  Username := 'USER_NAME';
  Password := 'PASSWORD';
  Host := 'HOST';

  try
    Connect();
  except
    // instrukcje wykonywane po zaistnieniu wyjątku
  end;
finally
  // instrukcje wykonane bez względu na zaistnienie wyjątku
  // np. zwolnienie z pamieci odpowiednich obiektów
end;

Wiedząc do czego służą bloki try finally oraz try except można zabezpieczyć pewne mechanizmy przed np. wyciekami pamięci oraz dać możliwość wykonania odpowiednich instrukcji w razie wystąpienia wyjątku;

EDIT: @hipekk - wątek przenoszę do działu dla początkujących, ponieważ dotyczy podstawowego zagadnienia konstrukcji języka.

0

a co chcesz żeby ci try..finally..end wyłapało wyjątek? Przecież blok po finally wykona się nawet jeśli wystąpi wyjątek to raz dwa u Ciebie nie ma co się wykonać trzy spróbuj try..except..end

@furious programming Byłeś szybszy ;)

0

Dziękuję serdecznie Panowie.
Źle zrozumiałem działanie try..except/finally..end.
Wydawało mi się ze to czy użyje except czy finally decyduje tylko o tym czy zareaguję w jakiś sposób na wystąpienie wyjątku (użycie except) czy nie (użycie finally).
Teraz już wiem (chyba ;) ) jak stosować obydwie instrukcję (a pisana aplikacja działa już poprawnie ;) ).

Jeszcze raz dziękuje i pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1