Usuń ostrzeżenia z PHP

Odpowiedzi:

349

Naprawdę powinieneś naprawić wszystko, co powoduje ostrzeżenie, ale możesz kontrolować widoczność błędów za pomocą error_reporting(). Aby pominąć komunikaty ostrzegawcze, możesz użyć czegoś takiego:

error_reporting(E_ERROR | E_PARSE);
Tatu Ulmanen
źródło
53
E_ALL ^ E_WARNING, włączenie wszystkich raportów błędów oprócz ostrzeżeń wydaje się lepszym wyborem argumentu error_reporting.
Mark Amery
1
generalnie się zgadzam, w moim przypadku generowanie komunikatu ostrzegawczego było zamierzonym zachowaniem, ponieważ było częścią moich testów jednostkowych.
pgee70
120

Możesz umieścić @ przed wywołaniem funkcji, aby ukryć wszystkie komunikaty o błędach.

@yourFunctionHere();
PetPaulsen
źródło
4
To po prostu ukrywa błąd, nadal się dzieje. Błędy powodują spowolnienie PHP, więc najlepiej naprawić błąd, jeśli to w ogóle możliwe. Użycie @ nawet spowalnia kod, gdy nie ma błędu. vega.rd.no/articles/php-performance-error-suppression
dprevite
46
Czasami (niestety) naprawdę nie masz wyboru. Na przykład funkcja PHP parse_url () generuje ostrzeżenia dla „poważnie zniekształconych” adresów URL - co jest prawdopodobnie błędem, ponieważ w tym przypadku funkcja zwraca false. Musisz więc albo tolerować te ostrzeżenia PHP w wynikach programu (może to być niedopuszczalne dla aplikacji analizatora składni / sprawdzania poprawności), w jakiś sposób pomijać Ostrzeżenia lub obejść zepsute zachowanie PHP, pisząc własny analizator składni / sprawdzania poprawności adresów URL. W takim przypadku wybieram @.
Peter,
1
WAŻNE: Użyj tej metody iff (1) nie możesz rozwiązać problemu, który generuje ostrzeżenie, ani (2) ukryć ostrzeżeń przed użytkownikami końcowymi poprzez php error_reporting ... Ukrywanie ostrzeżeń przed programistami NIE jest rozwiązaniem.
Joshua Kissoon
3
Pozwól mi wyjaśnić, dlaczego jest to krytyczne. Niektóre funkcje, takie jak dns_get_recordwyrzucają ostrzeżenia. Twój kod może zrekompensować ostrzeżenie, ale nadal je wyrzuca. Wyłączenie raportowania błędów działa na serwerze produkcyjnym, ale nie na serwerze deweloperskim. W przypadku generowania treści XML ostrzeżenie spowoduje, że przeglądarka nie będzie renderowana, ponieważ serwer wysyła zniekształcony kod XML spowodowany ostrzeżeniem. Czasami chcesz tego podczas programowania, ale nie z powodu czegoś spowodowanego tymczasowym błędem wyszukiwania DNS, który już kompensujesz.
Alice Wonder
2
Pozwól, że wyjaśnię, dlaczego jest to przydatne, gdy zamiast wszystkich komunikatów ostrzegawczych to Ty chcesz potraktować to ostrzeżenie jako błąd i wygenerować swój własny komunikat o błędzie
Daniel N.
43

Aby ukryć ostrzeżenia, pozostawiając włączone wszystkie inne raporty błędów:

error_reporting(E_ALL ^ E_WARNING); 
Karthik
źródło
18

Jeśli chcesz ukryć ostrzeżenia i niektóre inne typy błędów (na przykład powiadomienia) podczas wyświetlania wszystkich innych błędów, możesz:

error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE);
zstate
źródło
15

w Core Php, aby ukryć komunikat ostrzegawczy, ustawić raportowanie błędów (0) w górnej części wspólnego pliku dołączania lub pojedynczego pliku.

W Wordpress ukryj Ostrzeżenia i powiadomienia dodaj następujący kod w pliku wp-config.php

ini_set('log_errors','On');
ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
Vijay Lathiya
źródło
To najlepsze rozwiązanie, jeśli chodzi o ukrywanie dzienników w Wordpress. Dziękuję Ci!!
Neo Morina,
10

Nie do końca odpowiadam na pytanie, ale myślę, że w niektórych sytuacjach jest to lepszy kompromis:

Miałem komunikat ostrzegawczy w wyniku instrukcji printf () w bibliotece innej firmy. Wiedziałem dokładnie, co było przyczyną - tymczasowe obejście, podczas gdy strona trzecia naprawiła swój kod. Zgadzam się, że ostrzeżenia nie powinny być pomijane, ale nie mogłem zademonstrować swojej pracy klientowi, gdy na ekranie pojawia się komunikat ostrzegawczy. Moje rozwiązanie:

printf('<div style="display:none">');
    ...Third-party stuff here...
printf('</div>');

Ostrzeżenie było nadal w źródle strony jako przypomnienie dla mnie, ale niewidoczne dla klienta.

DaveWalley
źródło
5
Osobiście skorzystałbym ob_start()i ob_end_clean()zamiast tego. W ten sposób rzeczy nie są nawet wysyłane do przeglądarki (co robi tutaj).
h2ooooooo 30.12.12
6
Dlatego dołączyłem „niektóre sytuacje”, „ostrzeżenia nie powinny być tłumione” i „przypomnienie mi”.
DaveWalley,
1
Zanim oddasz mi więcej głosów, przeczytaj moją odpowiedź. Uwaga „firma zewnętrzna”, „kompromis” i komentarz powyżej. Dodałem tę odpowiedź na wypadek, gdyby ktoś był w takiej samej sytuacji, w jakiej byłem, i w tej konkretnej sytuacji uratowało mnie to, podczas gdy wszystkie inne odpowiedzi nie byłyby tak dobre. Następnym razem pomyślę dwa razy o byciu pomocnym.
DaveWalley,
Dziękujemy, że nie usunąłeś tego genialnego pomysłu. W moim systemie zapisuję wszystkie błędy i ostrzeżenia, odesłane od klientów, a gdy loguje się administrator, są natychmiast powiadamiani o wszelkich takich działaniach, aby mogli doradzać ekipie obsługi technicznej. Witryna przeznaczona jest do gier edukacyjnych, więc nie jest to wielka sprawa, jeśli coś pójdzie nie tak przez godzinę.
cneed
8

Robię to w następujący sposób w moim php.ini :

error_reporting = E_ALL & ~E_WARNING  & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED

Rejestruje tylko błędy krytyczne i brak ostrzeżeń.

navid
źródło
7

Myślę, że lepszym rozwiązaniem jest konfiguracja .htaccess W ten sposób nie musisz zmieniać kodu aplikacji. Oto wytyczne dla Apache2

php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
php_value docref_root 0
php_value docref_ext 0
Sebastian Piskorski
źródło
7

Możesz wyłączyć ostrzeżenie za pomocą raportowania błędów, ale o wiele lepszym sposobem jest poprawienie skryptu w pierwszej kolejności.

Jeśli nie wiesz jak, edytuj swoje pytanie i pokaż nam odpowiedni wiersz oraz wyświetlone ostrzeżenie.

Pekka
źródło
7
Safaali, powinieneś naprawić problemy, a nie ignorować.
Sampson
2
Safaali, widząc, że interesujesz się PHP, zrób sobie przysługę i spróbuj naprawić ten skrypt.
Pekka
0

Odpowiedź już jest u operatora kontroli błędów, ale nie ma wyjaśnienia. Możesz używać @operatora z każdym wyrażeniem i ukrywa ono błędy (oprócz błędów krytycznych).

@$test['test']; //PHP Notice:  Undefined variable: test

@(14/0); // PHP Warning:  Division by zero

//This is not working. You can't hide Fatal Errors this way.
@customFuntion(); // PHP Fatal error:  Uncaught Error: Call to undefined function customFuntion()

Do debugowania jest to szybka i idealna metoda. Ale nigdy nie powinieneś używać go w wersji produkcyjnej ani na stałe dołączać do swojej lokalnej wersji. Zapewni ci wiele niepotrzebnego podrażnienia.

Zamiast tego należy rozważyć:

1. Ustawienia raportowania błędów wymienione w zaakceptowanej odpowiedzi.

error_reporting(E_ERROR | E_PARSE);

lub z ustawień PHP INI

ini_set('display_errors','Off');

2. Łapanie wyjątków

try {
    $var->method();
} catch (Error $e) {
    // Handle error
    echo $e->getMessage();
}
Tajni
źródło
0

Aby zignorować wszystkie ostrzeżenia, użyj tego przykładu na górze kodu:

error_reporting(0);
Ada
źródło
Jaka jest różnica między twoją odpowiedzią a odpowiedzią zaakceptowaną?
endo64