Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> wyjatki
AcidBurnt
post
Post #1





Grupa: Zarejestrowani
Postów: 215
Pomógł: 1
Dołączył: 13.04.2003
Skąd: z ławki przed blokiem

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


Witam

catch try itp, probuje tym jakas zawladnac tylko chyba nie za bardzo rozumiem idei (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

powiedzmy mam taki kodziek

  1. <?php
  2. foreach($a as $b){
  3. echo $b;
  4. }
  5. ?>


no i w sumie wiadomo ze $a musi byc tablica inaczej error:

Warning: Invalid argument supplied for foreach() in D:\WWW\nieruchomosci\admin\test.php on line 5

no wiec jak wylapac takiego wyjatka?

musze dac np cos takiego:
  1. <?php
  2. try {
  3. if(!is_array($a))
  4.  throw new Exception('$a musi byc tablica');
  5. else{
  6. foreach($a as $b){
  7. echo $b;
  8. } 
  9. }
  10.  
  11.  
  12. } catch (Exception $e) {
  13.  echo 'Caught exception: ', $e->getMessage(), "n";
  14. }
  15. ?>


przyklad blogu try catch z php.net

tak to trzeba robic czy mozna nie wiem jakaos latwiej ;p
Go to the top of the page
+Quote Post
Diwi
post
Post #2





Grupa: Zarejestrowani
Postów: 245
Pomógł: 4
Dołączył: 22.01.2005

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


Wyjątek zawsze musisz wyrzucić lecz jeżeli nie chcesz pisać cały czas w bloku catch:
echo ...

możesz stworzyć sobie klase osłonową która dziedziczy po Exception, przykład klasy która u mnie odpowiada za wyrzucanie wątków krytycznych i odrazu wyświetlanie ich na ekran użytkownikowi:

  1. <?php
  2. class SystemException extends Exception 
  3. {
  4. public function __construct( $strErrorMessage )
  5. {
  6. parent::__construct( $strErrorMessage );
  7.  
  8. echo 'Wystąpił błąd krytyczny: '.$strErrorMessage.'<br /><br />';
  9.  
  10. foreach( parent::getTrace() as $arrTrace ) 
  11. {
  12. echo 'Plik: <strong>'.$arrTrace['file'].'</strong><br />';
  13. echo 'Linia: <strong>'.$arrTrace['line'].'</strong><br />';
  14. echo 'Klasa: <strong>'.$arrTrace['class'].'</strong><br />';
  15. echo 'Funkcja: <strong>'.$arrTrace['function'].'</strong><br />';
  16. echo 'Argumenty funkcji: ';
  17.  
  18.  
  19. echo '<ul>';
  20. foreach( $arrTrace['args'] as $strArgument )
  21. {
  22. echo '<li>'.$strArgument.'</li>';
  23. }
  24. echo '</ul>';
  25.  
  26. echo '<br /><br />';
  27. }
  28. }
  29. }
  30. ?>


Później jeżeli będziesz potrzebował stworzyć więcej typów wyjątków (tak aby odpowiedni wyjątek był rzucany w danej sytuacji) możesz po prostu dziedziczyć po SystemException.

Przykład:
  1. <?php
  2. class IsNotArrayException extends SystemException {}
  3. ?>


Pozdrawiam

Ten post edytował Diwi 6.06.2006, 15:27:02
Go to the top of the page
+Quote Post
Vomit
post
Post #3





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

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


Ja do konca nie rozumiem tego... wielu uzytkownikow zwracało mi uwage, ze wyjatek nie musi byc wyrzucony na ekran i pokazany uzytkownikowi, ze w wielu przypadkach sluzy on tylko programiscie.

Ale jak wykorzystac nie wyrzucone wyjatki?
Go to the top of the page
+Quote Post
NuLL
post
Post #4





Grupa: Zarejestrowani
Postów: 2 262
Pomógł: 21
Dołączył: 3.05.2004
Skąd: Sopot, Krakow, W-wa

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


Zapisac do loga (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif) (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
LBO
post
Post #5





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Tutaj kilka ciekawych zdań na temat wyjatków... w sumie tekst odpowiada na wszystkie zadae przez ciebie pytania. What are Exceptions? - The Concept
Go to the top of the page
+Quote Post
dyktek
post
Post #6





Grupa: Zarejestrowani
Postów: 240
Pomógł: 0
Dołączył: 18.01.2004
Skąd: rzeszów / kraków

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


a czy wyjątek można zapisać a potem odczytać bez zatrzymywania kodu, np. gdy wystapi jakis błąd który nie jest błędem krytycznym ale zgłaszam wyjątek w momencie gdy on wystąpi kod się zatrzyma jeśli zrobie to tak jak ponizej:

  1. <?php
  2. try {
  3. //cos tam
  4. }
  5. catch(Exception $e){
  6. // $e->getMessage();
  7. }
  8. ?>
Go to the top of the page
+Quote Post
Vomit
post
Post #7





Grupa: Zarejestrowani
Postów: 122
Pomógł: 0
Dołączył: 23.01.2006

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


I jak rozpoznac czy wyjatek jest krytyczny, ze trzeba zatrzymac kod, czy nie?
Go to the top of the page
+Quote Post
dyktek
post
Post #8





Grupa: Zarejestrowani
Postów: 240
Pomógł: 0
Dołączył: 18.01.2004
Skąd: rzeszów / kraków

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


Cytat(Vomit @ 7.06.2006, 11:25 ) *
I jak rozpoznac czy wyjatek jest krytyczny, ze trzeba zatrzymac kod, czy nie?

no właśnie na tym polega moj problem
Go to the top of the page
+Quote Post
athabus
post
Post #9





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Cytat(dyktek @ 7.06.2006, 06:16 ) *
a czy wyjątek można zapisać a potem odczytać bez zatrzymywania kodu, np. gdy wystapi jakis błąd który nie jest błędem krytycznym ale zgłaszam wyjątek w momencie gdy on wystąpi kod się zatrzyma jeśli zrobie to tak jak ponizej:

  1. <?php
  2. try {
  3. //cos tam
  4. }
  5. catch(Exception $e){
  6. // $e->getMessage();
  7. }
  8. ?>


Wyjątek zawsze "zatrzymuje" wykonanie kodu który jest w bloku. Jeśli chcesz kontynuować wykonywanie kodu to musisz po prostu zrobić tak
  1. <?php
  2. try {
  3. //kod który zostanie zatrzymany
  4. }
  5. catch(Exception $e){
  6. // $e->getMessage();
  7. }
  8.  
  9. //kod który ma być wykonany nawet jesli wystapi wyjatek
  10. ?>



Co od rozpoznania czy dany wyjatek jest krytyczny - najlepiej stworzyc sobie klasy pochodne po wyjatku - czyli wlasne wyjatki - wtedy bedziesz wiedzial jaki wyjatek wystapil czyli np tak
  1. <?php
  2. try {
  3. //kod
  4. }
  5. catch (DbException $e)
  6. {
  7. //obsluga wyjatku bazy danych
  8. }
  9. catch (FileException $e)
  10. {
  11. //obsluga wyjatku zwiazanego z plikiem
  12. }
  13. catch(Exception $e){
  14. // obsluga kazdego innego wyjatku
  15. }
  16.  
  17. ?>


Ten post edytował athabus 7.06.2006, 12:15:38
Go to the top of the page
+Quote Post
LBO
post
Post #10





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


A'propos rozpoznania, czy wyjątek jest krytyczny... fakt, możesz stworzyć własne wyjątki, ale jak jest napisane w tekście który podałem wyżej - powinny służyć niejako do dania możliwości skryptowi podjęcia alternatywnych działań. Dlatego jako wyjątek krytyczny rozumiem taki, który skrypt zatrzymuje. I tutaj do gry wchodzą kody - sam definijjesz kod wyjątku i sam stwierdzasz czy jest krytyczny, ale przynajmniej jsteś w stanie ocenić czy wyjątek jest krytyczny czy nie.
Go to the top of the page
+Quote Post
athabus
post
Post #11





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


@LBO Przejrzałem pobierznie tego arta - fajny tekst - muszę go przeczytać dokładniej w wolnej chwilii.
Do tej pory raczej nie używałem kodów błędów w celu określenia "krytyczności" wyjątku, zazwyczaj wystarczało mi określenie typu wyjątku, żeby podjąć dalsze działania - kody mogą się jednak przydać gdy moje skrypty staną się bardziej skomplikowane, żeby ograniczyć ilość klas pochodnych od Exception (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)

Taka moja ogólna refleksja - która jest zdaje się zgodna z tym artykułem - to, żeby nie nadużywać wyjątków. Wyjątki są ok, ale kod taki jak np. ten poniżej jest przykładem niepotrzebnego użycia (IMHO). Mówię to dlatego, że w manualach, książkach itp takie przykłady właśnie są podawane.

  1. <?php
  2. try {
  3. if(!is_array($a))
  4.  throw new Exception('$a musi byc tablica');
  5. else{
  6. foreach($a as $b){
  7. echo $b;
  8. } 
  9. }
  10.  
  11.  
  12. } catch (Exception $e) {
  13.  echo 'Caught exception: ', $e->getMessage(), "n";
  14. }
  15. ?>


Wyjątki służą raczej do sygnalizowania problemów, którego sposób obsłużenia będzie zależny od kontekstu w jakim metoda wyrzucająca wyjątek zostanie użyta - przynajmniej ja tak je rozumiem

//edit: No i jeszcze oczywiście dodam, że tworząc własne klasy wyjątków można zapisać więcej informacji "środowiskowych" z momentu gdy wystąpił wyjątek - np. Jeśli jest to wyjątek bd - można "zapamiętać" ostatnie zapytanie, nr błędu zwrócony przez bazę, komunikat itp itd - ma to spore znaczenie np. gdy wywołuje się zapytania w pętli

Ten post edytował athabus 7.06.2006, 15:02:43
Go to the top of the page
+Quote Post
LBO
post
Post #12





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


Oczywiście tworzenie własnych wyjątków jest wskazane jaknajbardziej. Nie pisałem rzecz jasna, by tworzyć milion kodów (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) dla klasy Exception, tylko jakoś to rozłożyc pomiędzy własne rozszerznie - trzeba znależć złoty środek. Ja na przykład staram się łączyć klasy w grupy (tzw paczki/package), dajmy na to klasa Image(). Służy do manipulowania zdjęciami (rotacja, skalowanie itp.) i posiada kilka zdefiniowanych kodów błędów (dałem pierwsze 5):
  1. <?php
  2. define('IMAGE_READ_ERROR', 0);
  3. define('IMAGE_WRITE_ERROR', 1);
  4. define('IMAGE_OUTPUT_ERROR', 2);
  5. define('IMAGE_IMAGETYPE_ERROR', 3);
  6. define('IMAGE_TRANSFORMATION_ERROR', 4);
  7. ?>

Następnie stworzyłem klasę BatchImage (masowa transformacja zdjęć) i np nie widzę powodu czemu ta klasa miała, by wyrzucać wyjątek BatchImageException, skoro nadal wszystko kręci się wokół manipulacji na zdjęciach. BatchImage również rzuca ImageException, ale kontekstu mogę się dowiedzieć z kodu (np. define('BATCHIMAGE_TRANSFORMATION_ERROR', 12);). Jest to moim zdaniem bardziej naturalne i elastyczne - moge zareagować na poszczególne błędy,a resztę olać.

Ten post edytował LBO 7.06.2006, 16:56:31
Go to the top of the page
+Quote Post
bigZbig
post
Post #13





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Jesli wyjatki maja sluzyc tylko do poinformowania programisty o nieprawidlowym dzialaniu aplikacji to wystarczy odpowiedni komunikat w standardowym wyjatku. Ja natomiasts uzywam wyjatkow do sterowania praca aplikacji i wtedy o wiele uzyteczniejsze jest uzycie nazwanych wyjatkow.

Prosty przyklad:

System logowania. Koles wpisuje w pola login i password niedozwolone dane (np. login zawiera spacje, albo password jest wartoscia pusta). Obiekt Request filtruje dane przeslane metoda POST przez uzytkownika, a poniewaz na wartosci zmiennych login i password zostaly nalozone ograniczenia wykrywa ich niepoprawnosc wiec rzuca wyjatek. Aplikacja wykrywa wyjatek obiektu Request, a poniewaz jest to wyjatek nazwany np. RequestConstraintValueException podejmuje zdefiniowana w sekcji catch akcje ktora polega na przekierowaniu spowrotem na strone, z ktorej nadeszlo zadanie.
Go to the top of the page
+Quote Post
hwao
post
Post #14


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




http://hwao.be/blog/2006/06/16/wyjatki/

Odnosnie tematu, napisalem notke (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
athabus
post
Post #15





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Cytat(hwao @ 16.06.2006, 11:34 ) *

Super opisałeś wyjątki. W zasadzie zagadnienie już trochę poznałm, ale dla kogoś kto jeszcze nie używał wyjątków artykuł na pewno będzie przydatny... Aż sobie RSS dodałem do mojego czytnika (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 18.12.2025 - 20:44