ďťż
Podstrony
|
telcocafeWitamMam taki problemik...próbuje się nauczyć dobrze obsługiwać błędy przy wykorzystaniu klasy exception. Zacząłem od stworzenia własnej klasy <?php class contentException extends Exception { // Redefine the exception so message isn't optional public function __construct($message, $code = 0) { // some code // make sure everything is assigned properly parent::__construct($message, $code); } // custom string representation of object public function __toString() { return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; } } ?> teraz mam taki kawałek kodu (fragment klasy addContent): function setContent($content) { if(!is_string($content) || strlen($content) == 0) { throw new contentException('Niepoprawna treść!'); } else { echo $content; $this->_content = $content; } } I teraz mój problem polega na tym. Jeżeli zrobie tak (fragment test.php gdzie testuję powyższą klasę): $content->setContent(''); to owszem wyświetli mi komunikat "niepoprawna treść" ale wyskoczy to jako fatal error wraz z ścieżką do pliku chyba że dam to w bloki try i catch. Jednakże dla mnie to się mija z celem bo musiałbym każdą metodę dawać w te bloki. Więcej czasu zajęło by mi pisanie samych try catch niż tworzenie aplikacji :/ czy można jakoś wymusić żeby kod który zrobiłem generował wyjątki tak jak należy bez okładania każdej metody blokami try i catch ? Użytkownik Dawid-San edytował ten post 20 luty 2008, 16:41 Hmm. z tego co wiem to wyjątki w PHP, C++, Javie są po to aby je obsługiwać, a nie wyrzucać tylko na konsole(tzn. do wyniku):P Bez try-catch całość mija się z celem, lepiej wtedy zrób jakiś mechanizm powiadomień czy zwykłe echo przy błędzie. I tak to wszystko dojdzie to tej samej postaci, jeśli byś pominął try-catch. a czy można metode w klasie kodować tak: function setContent($content) { try { if(!is_string($content) || strlen($content) == 0) { throw new contentException('Niepoprawna treść news`a!'); } else { $this->_content = $content; } } catch (contentException $ex) { echo $ex->getMessage(); } } To działa więc błedów nie ma. Jednak kiedyś czytałem że nie powinno się wywoływać instrukcji echo w kodzie klasy. Czemu? I czy jest to taki duży błąd? Szczerze to nawet nie wiedziałem o takich zaleceniach:) Jeszcze nigdy się z tym nie spotkałem, a wierz mi niejedną książkę przeczytałem(dobra, większość to o Javie, ale te języki mają podobne konwencje) a i będąc administratorem podstrony mojej szkoły napatrzyłem się dużo na kod PHP:) Może i coś w tym jest, bo np. jak wywołasz <img src="zdjecia.php?id=5" alt="Zdjęcie" /> a zdjecia.php wygląda tak: <?php //założenia - w database.php znajduje się klasa Database posiagająca metodę getPhoto($id) zwracającą obrazek z serwera/bazy //danych, odkodowany header('Content-type: image/jpeg'); include 'database.php'; $database = new Database(); $id = $_GET['id']; $zdjecie = $database->getPhoto($id); echo $zdjecie; ?> a tu zamiast zdjęcia kod walnie Ci napis to zbytnio miłe to nie będzie:( Jeśli się namachasz na tyle by wstawić zamiast napisu zdjęcie to ok, ale przez przypadek możesz niezłego bałaganu narobić. W niektórych przypadkach wywołanie echo w metodzie to dla mnie nie jest nic złego, ale zwykle daje się instrukcje return zwracającą ewentualny napis. Bo w takim wypadku jak tu możesz dostać nawet błąd($zdjecie może zostać puste). PS. Wiem, że przykład trochę nie do końca udany ale nie miałem innego pomysłu;) tak ale jeśli dam return $komunikat to pierw muszę albo przed metodę dać echo albo przypisać do zmiennej wynik metody i wywołać zmienną. Tak mam gwarancję, że zrobi się to automatycznie, a że jest to obsługa błedu nie boję się o to, że wyświetli coś niepożadanego Hmm... na moim przykładzie to użycie echo nie jest zbyt sensowne w funkcji, ale w Twoim przypadku, tak jak pisałem, nie widzę żadnych przeciwwskazań. Chciałem Ci tylko pokazać, że wyrzucanie wszystkiego na konsole/strone nie zawsze jest dobre. Pomyśl - jeśli w funkcji getPhoto najpierw dasz echo $dane; a potem echo $komunikat; to i tak zdjęcia nie zobaczysz(nawet gdyby to było specjalnie przygotowane zdjęcie w stylu "Zdjęcie czasowo niedostępne" jak na nk). Ale jeśli nie wyświetlisz błędu to przynajmniej zdjęcie będzie(a pamiętaj że wywołujesz dla atrybutu src znacznika img). Dwa razy return natomiast nigdy nie zrobisz:) Z drugiej strony zwykle prowadzi się do rozdzielenia funkcjonalności klasy i kodu tak, aby nigdy kod nie musiał się przygotowywać na ewentualne niespodzianki ze strony klasy. Podsumowując, tak jak napisałeś może być, chciałem tylko przestrzec że nie w każdej sytuacji dodatkowe echo ma sens. Ale jak to ma być w obsłudze błędu(w bloku catch) jw. i wiadomo że komunikat szkody nie narobi(tzn. nie zwraca funkcja kodu do np. wartości atrybutów i zmiennych tak że później możesz mieć brak wartości zmiennej), naprawdę nie masz się czym przejmować :) BTW. na takie sytuacje są właśnie wyjątki, szkoda że z nich rezygnujesz:( Użytkownik Tomek92 edytował ten post 21 luty 2008, 17:04 |
|||
Sitedesign by AltusUmbrae. |