Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Problem z wyjątkami
Capellini
post 31.01.2009, 15:44:41
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

Ostrzeżenie: (0%)
-----


  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.


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
blooregard
post 31.01.2009, 15:59:54
Post #2


Newsman


Grupa: Moderatorzy
Postów: 2 033
Pomógł: 290
Dołączył: 21.12.2007
Skąd: Łódź




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. ?>


--------------------
Life's simple... You make choices and don't look back...
Go to the top of the page
+Quote Post
Capellini
post 31.01.2009, 16:13:55
Post #3





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Capellini 31.01.2009, 16:16:11


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
230005
post 31.01.2009, 19:33:48
Post #4





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Capellini
post 31.01.2009, 19:59:08
Post #5





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Capellini 31.01.2009, 20:06:03


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post
230005
post 31.01.2009, 20:16:28
Post #6





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


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 )
Go to the top of the page
+Quote Post
Capellini
post 31.01.2009, 22:02:46
Post #7





Grupa: Zarejestrowani
Postów: 70
Pomógł: 0
Dołączył: 16.10.2007

Ostrzeżenie: (0%)
-----


Teraz działa, dokładnie o to chodziło. W dodatku bardzo proste rozwiązanie.

Ten post edytował Capellini 31.01.2009, 22:03:34


--------------------
WIELKIE DZIĘKI ZA POMOC!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 07:25