Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak przejąć Fatal error i inne
Forum PHP.pl > Forum > PHP
szajens
Witam,


jak po wyłączeniu wyświetlania błędów:



jak je przejąć żeby wysłać bądź zapisać w jakimś pliku?

Przejrzałem sieć i jako że notice można przejąć to nie znalazłem Fatal error itd.
Pyton_000
O tak: https://blog.piotrows.pl/php-parser-error-handler/
szajens
Dzięki za pomoc zaraz po testuje, tak myślałem że kiedyś coś podobnego mi się rzuciło tylko nie wiedziałem gdzie.

ps. Wszystko fajnie, ale co jeżeli mamy notica i fatal error, jak pobrać wszystkie a nie ostatni error?
Pyton_000
Inne błędy musisz łapać już przez error_handler

http://php.net/manual/en/function.set-error-handler.php

To co Ci podałem łapie ostatni błąd który wywala skrypt (błędy fatal itp.)
Błędy miękkie typu notice, warnind, deprecated lapiesz już ww. funkcją. Masz tam przykład jak je łapać.
szajens
właśnie zanim napisałeś wpadłem na tą funkcje, zastanawiałem się właśnie czy trzeba używać dwóch, ale zanim napisałem już odpowiedziałeś smile.gif

Cytat
To co Ci podałem łapie ostatni błąd który wywala skrypt

da się wyłapać pierwszy a nie ostatni? //edit: teraz wyłapuje mi normalnie pierwszy, coś wcześniej pokręciłem przy testowaniu, przy połączeniu 2 funkcji można całość przenieś np z ekranu do pliku i o to mi chodziło dzięki za pomoc
Comandeer
A czy przypadkiem od PHP7 nie wystarcza łapać wyjątków dziedziczących po Error? http://php.net/Error
szajens
Comandeer mógłbyś rozwinąć myśl ? Jakiś przykład bo nie mogę se poradzić smile.gif
Comandeer
  1. <?php
  2. try {
  3. babol();
  4. } catch( Error $e ) {
  5. var_dump( $e->getMessage() ); // Call to undefined function babol()
  6. }

Oczywiście syntaxy jest trudniej złapać, ale na to AFAIR metoda Pytona już pomoże wink.gif
szajens
Źle złapałem myśl, myślałem że jest od php 7 inna możliwość przejmowania błędów. Wyjątki już trochę poznałem ale do tego co chce uzyskać się nie nadają.
Potrzebuje wyłapać błędy jeżeli już będą, automatycznie.
Po prostu zamiast wyświetlić błędy na ekranie chce je wysłać mailem smile.gif
Wydaje mi się że walenie wszędzie wyjątków to strata czasu i niepotrzebny kod.
Comandeer
Cytat
Wydaje mi się że walenie wszędzie wyjątków to strata czasu i niepotrzebny kod.

Od PHP7 wszystkie błędy są z automatu wyjątkami dziedziczącymi po Error.
szajens
można je automatycznie wyłapywać? Bez pisania dla każdej funkcji coś w stylu
  1. throw new Exception('');


edit: chyba nie za bardzo łapie jeszcze logikę tego rozwiązania

ale nie wyobrażam sobie pisania dla każdej funkcji wyjątku


edit2: Rozumiem że set_exception_handler jest obiektowym odpowiednikiem funkcji podanej przez Pytona (register_shutdown_function)?
Zauważyłem że zwraca to samo, jedyna różnica że nie trzeba wyłączać error_raporting
Pyton_000
raczej set_error_handler
tyle że przyjmuje 1 parametr
szajens
  1. <pre>
  2. <?php
  3.  
  4. //error_reporting(0);//
  5.  
  6. function exception_handler($exception) {
  7. print_r($exception->getMessage());
  8. echo "\n";
  9. }
  10.  
  11. function exception_handler_a($exception1,$exception2) {
  12. print_r($exception2);
  13. echo "\n";
  14. }
  15.  
  16.  
  17.  
  18. set_exception_handler('exception_handler');// fatal
  19. set_error_handler('exception_handler_a'); // notice
  20.  
  21.  
  22. echo $zmienna_niezdef;
  23.  
  24. echo $fgwegf;
  25. echo $fgwefegerggf;
  26. Klasa_blad::rererg();
  27. wefefwef();
  28. wefefwwsedfweef();
  29.  
  30.  
  31. ?>


wyjście:
  1. Undefined variable: zmienna_niezdef
  2. Undefined variable: fgwegf
  3. Undefined variable: fgwefegerggf
  4. Class 'Klasa_blad' not found
  5.  
  6.  


Wiec Python jesteś jednak chyba w błędzie, choć raz tongue.gif

rozumiem że w ten sposób mam to używać, że tak jest poprawnie, bo to że działa to mnie nie zadowala smile.gif
Pyton_000
Wiesz nie testowałem tego więc to są moje domniemania smile.gif
szajens
Szukam ale nie mogę znaleźć jak w funkcji wygenerować błąd aby wyskoczył podczas jej użycia wskazując linie kodu a nie linie w funkcji, ale bez bloków try catch? Próbowałem trigger_error ale wywala mi w funkcji

edit:
w sumie można użyć:
  1. function error($message, $level=E_USER_NOTICE) {
  2. $caller = next(debug_backtrace());
  3. trigger_error($message.' in <strong>'.$caller['function'].'</strong> called from <strong>'.$caller['file'].'</strong> on line <strong>'.$caller['line'].'</strong>'."\n<br />error handler", $level);
  4. }


ale niema innego sposobu?
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.