Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Exception
Forum PHP.pl > Forum > PHP
Fixus
Witam
Mam taki problemik...próbuje się nauczyć dobrze obsługiwać błędy przy wykorzystaniu klasy exception. Zacząłem od stworzenia własnej klasy
Kod
<?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):
Kod
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 (w pliku test.php gdzie testuję powyższą klasę):
Kod
$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 ?
Jarod
Cytat(Fixus @ 20.02.2008, 16:36:59 ) *
(...)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 ?

Jeśli chcesz obsługiwać wyjątki to, wyjątek musi zostać zgłoszony w bloku try i musisz taki wyjątek przechwycić (catch). Nie da się inaczej. Ja w klasach wyrzucam tylko wyjątki, a w głównym kontrolerze (index.php) umieściłem try-catch.
Pzdr
Fixus
yhm a czy dużym błędem jest jeśli metodę w klasie zakoduje tak:
Kod
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();
        }    
    }


Bo coś chyba czytałem gdzieś, że nie powinno się dawać instrukcji echo w kodzie klasy
Jarod
Cytat(Fixus @ 20.02.2008, 17:00:11 ) *
yhm a czy dużym błędem jest jeśli metodę w klasie zakoduje tak:
Kod
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();
        }    
    }


Bo coś chyba czytałem gdzieś, że nie powinno się dawać instrukcji echo w kodzie klasy


To nie jest błąd bo skrypt działa. IMO nie powinieneś tego tak pisać.
Fixus
a możesz powiedzieć czemu nie powinienem? Chce to dobrze zrozumieć smile.gif
Jarod
Cytat(Fixus @ 20.02.2008, 18:04:06 ) *
a możesz powiedzieć czemu nie powinienem? Chce to dobrze zrozumieć smile.gif

Przepraszam Cię bardzo. Jest ok. Źle przeczytałem. Wstaw kod w znaczniki [php] - będzie się łatwiej czytać.

Pozdrawiam

EDIT: Chociaż ja preferuję inny sposób. Ale ja stosuję MVC i u mnie widok jest odpowiedzialny za wyświetlanie. W kontrolerze łapie wszystkie wyjątki.
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.