2013-04-08 16 views
22

Chciałbym móc rzucić w mojej klasie php fatalny, niepoprawny błąd, gdy użytkownik mojej klasy nadużywa czegoś, czego nie zamierzałem. Nie chcę, aby on/ona mogła odzyskać zdrowie dzięki klauzuli catch. Wiem o trigger_error, ale mogę tylko wysyłać ostrzeżenia lub powiadomienia.PHP: Błąd krytyczny wyzwalacza?

+1

Po co? Ktokolwiek wdraża twoją klasę: 1. Jest programistą. 2. Ma dostęp do źródła. 3. Może i prawdopodobnie usunie wywołanie 'trigger_error()'. – Sammitch

+1

@ Sammitch: Chcę, aby moje intencje były jasne. Chcę pozwolić każdemu, kto używa mojego kodu, wiedzieć, że to, co robią, nie jest tym, w jaki sposób zamierzałem go użyć. Wyrzucenie wyjątku wysyła komunikat "zajmujesz się tym niezdefiniowanym zachowaniem". Chcę wysłać wiadomość: "Nie rób tego w ten sposób, zrób to w ten sposób". – DudeOnRock

+2

Przykładowe biblioteki. Gdzie powinieneś na przykład absolutnie NIE zrobić czegoś, jeśli jakiś warunek nie jest prawdziwy. (Przydatne dla ludzi, którzy nie lubią czytać dokumentacji: P) – bwoebi

Odpowiedz

39

E_USER_ERROR jest stałą w kolorze.

trigger_error("Fatal error", E_USER_ERROR); 

Zobacz także pierwszy przykład strony podręcznika.

+6

bardzo ironiczne, że facet, który powiedział "Przydatny dla ludzi, którzy nie lubią czytać dokumentacji" nie zadał sobie trudu, aby przeczytać pierwszy przykład strony podręcznika. –

5
debug_print_backtrace(); 
trigger_error("As much information as you can provide, please", E_USER_ERROR); 
exit(); 

exit() całkowicie kończy skrypt PHP. Im więcej informacji możesz podać użytkownikom lub programistom na temat błędu, tym lepiej. Kody błędów są passé.

Edycja: użycie E_USER_ERROR powinno mimo to zakończyć skrypt, więc przenieśliśmy debug_print_backtrace() przed trigger_error().

+0

absolutnie, dodając umrzeć; lub wyjść; komenda po rzuceniu takiego błędu jest tylko w 100% pewna. Jedynym sposobem na ucieczkę od niego (spodziewać się wyłączonych funkcji php.ini) jest [runkit_function_remove] (http://php.net/manual/en/function.runkit-function-remove.php) –

8

Uwaga: jeśli używasz niestandardowej procedury obsługi błędów (patrz set_error_handler) E_USER_ERROR NIE Halt/wyjście/die ile obsługi błędów zwraca false

pigułce: niestandardowe obsługi błędów skutecznie określa, czy jest traktowana E_USER_ERROR jako śmiertelny

+2

Bardzo prawdziwe. Jak zauważyłem w innym miejscu, można utworzyć błąd krytyczny poprzez: jeśli ($ isTestMode == 1) { eval ("noSuchFunction();"); } Ta metoda zawsze działa. –

+0

Dzięki Brad to bardzo mi pomogło, używam funkcji obsługi błędów niestandardowych. Chociaż "obsługa błędu" wywołałem z flagą E_USER_ERROR, nie powodowało błędu "fatalnego", dopóki nie zwróciłem false z funkcji obsługi błędów. – dading84

Powiązane problemy