2009-09-20 22 views
6

Zastanawiam się, jaki wyjątkowy standard służy do obsługi błędów w Modelu.Obsługa błędów w modelu (MVC)

Obecnie mam metody "setError" i "getError", które są używane przez wszystkie moje modele.

Oznacza to, że interesuje mnie tylko to, czy wywołanie metody w moim modelu jest prawdziwe czy fałszywe. Jeśli jest fałszywa, użyłbym $this->model->getError() w moim kontrolerze.

Dodatkowo rozważam ustawienie osobnego pliku zawierającego wszystkie moje błędy. Jeden plik na model, również chciał mieć myśli na ten temat.

Odpowiedz

3

Prostszym rozwiązaniem byłoby użycie exceptions.

Po wystąpieniu błędu, który może być wyświetlany użytkownikowi, należy podać specjalny wyjątek - być może o nazwie UserError. Wyjątek powinien zawierać tekst komunikatu o błędzie podczas rzucania. Tego rodzaju błędy są cechy które dostarczają użytkownikom przydatnych informacji (tj próbowali usunąć coś, co nie istnieje - co może się zdarzyć, kiedy mają wiele przeglądarek otwarty, etc.)

np

throw new UserError("That object no longer exists."); 

Gdy wystąpi błąd, który chcesz ukryć przed użytkownikiem, wyślij inny rodzaj wyjątku o nazwie InternalError. W takim przypadku należy wykonać log i pozwolić programowi kontynuować, aby określony błąd był ukryty przed użytkownikiem. Jeśli przeszkadza to w działaniu, możesz rzucić ogólny komunikat o błędzie. Będą to błędy i chcesz je naprawić tak szybko, jak to możliwe.

np .:

throw new InternalError("Failed to connect to remote service"); 

Wszystkie komunikaty o błędach mogą być przechowywane (zakodowane) w źródle, gdzie jest wyjątek. Niekoniecznie jest to zła praktyka projektowa - jeśli używasz narzędzia takiego jak gettext, możesz z łatwością przetłumaczyć wszystkie te wiadomości.

+0

Podoba mi się ten pomysł, jedynym zastrzeżeniem jest, jeśli jest wiele błędów idealnie, chcę zapisać błąd i kontynuować wykonywanie. Stąd dlaczego używałem setError i getError. Sprawdzam, czy zwrot jest prawdą, co oznacza, że ​​wszystkie działania zakończyły się powodzeniem, a jeśli nie, otrzymam błąd. Działanie, które częściowo mi się powiodło, w wyniku czego chciałbym zwrócić wartość false i użyć funkcji getError, aby uzyskać komunikat wskazujący, która część zakończyła się niepowodzeniem. Mam nadzieję, że ma to sens. – Andre

1

Używam log4j i log4cxx i loguję się do syslogd. Kiwi jest prostym sysloggerem Win32, który będzie śledził twoje logi i zapisywał je do pliku. Log4j/Log4cxx mają pliki konfiguracyjne, których możesz użyć do ustawienia wszystkich poziomów logowania lub miejsc docelowych wiadomości do dziennika (możesz logować się w wielu miejscach).

Instalacja i użytkowanie przy użyciu tak niewielkiego nakładu jest bardzo skromne i działa jak urok.

Nie wypróbowałem samodzielnie log4php.

Wyjątki są dobre, gdy nie chcesz, aby Twój program kontynuował wykonywanie. Łap wyjątki na wysokim poziomie, gdzie możesz zaakceptować upadek nieudanych egzekucji.