Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z wyjątkami
Forum PHP.pl > Forum > Przedszkole
Capellini
  1. <?php
  2. function wikipedia($sl)
  3.  {
  4.    try
  5.    {
  6.      file_get_contents("http://www.pl.wikipedia.org/wiki/". $sl);
  7.      return true;
  8.    }
  9.  
  10.    return false;
  11.  }
  12. ?>


Funkcja ma zwrócić wartość true, jeżeli z funkcją file_get_contents nie ma żadnych kłopotów i wartość false, jeżeli jest jakiś błąd.

Nie jestem jeszcze zbyt obeznany w wyjątkach w PHP więc pomóżcie.
blooregard
Wyjątki nie zwracają wartości.
Jeśli wystąpi wyjątek, to w bloku catch() {} łapiesz wyjątek wyrzucony metodą throw() z bloku try {}.

Czyli Twój kod powinien wyglądać tak:
  1. <?php
  2. function wikipedia($sl)
  3. {
  4.   try
  5.   {
  6.     if (! ($pobrane =file_get_contents("http://www.pl.wikipedia.org/wiki/". $sl)) {
  7.          throw new Exception("Błąd. Nie udało sie pobrac czegos tam");
  8.    
  9.   }
  10.    
  11.   return $pobrane;
  12. } catch (Exception $e) {
  13.     echo $e->getMessage();    <- wyswietli komunikat bledu z wyrzuconego wyjatku, czyli to, co dales w wywolaniu throw()
  14. }
  15. ?>
Capellini
Funkcja ma zwracać wartość true, jeżeli można otworzyć stronę, a jeżeli nie to ma zwracać false.

Ta funkcja nie ma zwracać tego z file_get_contents tylko ma powiedzieć, czy można to coś pobrać.

Jeżeli nie można tego zrobić przy użyciu wyjątków, to w jaki inny sposób można to zrobić?

EDIT:

Próbowałem po prostu zwrócić zamiast $pobrane to true i zamiast wyświetlać $e->getMessage() to zwrócić false, ale jeżeli file_get_contents nie działa jak należy, to i tak wypisuje błąd.
230005
Ale użycie tego throw new Exception() samo w sobie sprawi, że w wymaganej sytuacji funkcja zwróci false. Właśnie po to istnieje taka konstrukcja - aplikacja przerywa w tym miejscu działanie (czyli jeśli po throw... dałeś return false, to się to return false nie wykona) i zwróci false.
Capellini
Ok.

Ale kod blooregard'a niestety nie działa bo (pomijając już małe błędy typu brak zakończenia nawiasu) wyrzuca mi błąd składni: unexpected T_RETURN, expecting T_CATCH więc czy ten catch nie powinien być zaraz po try? Zrobiłem tak, ale wtedy jest co prawda komunikat "Błąd. Nie udało sie pobrac czegos tam" i funkcja co prawda zwraca false, ale wypisuje także ten błąd, więc wygląda to tak:
Cytat
Warning: file_get_contents(): HTTP request failed! HTTP/1.0 403 Forbidden in E:\Moje\Najnowsze\funkcje.php on line 37 Warning: file_get_contents(http://www.pl.wikipedia.org/wiki/da): failed to open stream: No error in E:\Moje\Najnowsze\funkcje.php on line 37 Błąd. Nie udało sie pobrac czegos tam


Ja chcę żeby po prostu, jak wystąpi jakiś błąd, funkcja tylko zwróciła false i żeby nie wypisywało Warning: file_get_con... chcę żeby po prostu nie traktowało tego jako błąd. Czy da się tak zrobić?

Chodzi o to, że jak to zobaczy, że file_get_contents nie działa jak trzeba, to nie ma panikować, bo wszystko jest ok i ma tylko zwrócić false, a cały skrypt ma działać dalej.
230005
No więc:

Kod
<?php

function wikipedia()
{
  if(file_get_contents("http://www.pl.wikipedia.org/wiki/"))
      return true;
  else
      return false;  
}

if(@wikipedia())
    echo "ok";
else
    echo "nie ok";
  
?>


Wyjaśnienie: widzisz to wywołanie funkcji wikipedia w ifie poza funkcją? Ten znaczek - @ to wygłuszanie błędów, czyli jeśli strony nie znajdzie to tylko wypisze ten komunikat (nie ok u mnie smile.gif )
Capellini
Teraz działa, dokładnie o to chodziło. W dodatku bardzo proste rozwiązanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.