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 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 questionmark.gif snitch.gif


--------------------
Javascript, Coffeescript, Node.js, Mongo, CouchDb, chmury, workery & inne bajery - zycie jest zbyt krotkie aby miec nudna prace :)
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 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 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.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
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 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 ) *
http://hwao.be/blog/2006/06/16/wyjatki/

Odnosnie tematu, napisalem notke smile.gif

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 biggrin.gif
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 Aktualny czas: 19.08.2025 - 04:05