2016-11-01 7 views
6

W PHP5 ma to wiele sensu, gdy zdefiniowane są zarówno set_exception_handler(), jak i set_error_handler().Co dzieje się z set_error_handler() w PHP7 teraz, gdy wszystkie błędy są wyjątkami?

Jednak w PHP7 wszystkie (większość?) Błędy są teraz wyjątkami. Więc, o co chodzi w definiowaniu obu procedur obsługi, czy nawet błędy przejdą przez program obsługi wyjątku?

Widzę, że jest notatka na temat klasy PHP7 nowej Error w dokumencie obsługi wyjątków, ale nie ma odniesienia do faktu, że nie ma już zwykłych błędów, ale Throwable s, w funkcji obsługi błędu.

Od PHP 7, większość błędów są zgłaszane przez rzucanie Error wyjątki, które zostaną złowione przez przewodnika, jak również. Zarówno Error, jak i Exception implementują interfejs Throwable. [source]

+1

Błędy PHP nadal są problemem. ostrzeżenia i powiadomienia są nadal dostępne. – Federkun

+0

Jest to często błędne przekonanie, że wszystkie błędy są wyjątkami w PHP 7. Tak, PHP 7 teraz rzuca więcej wyjątków niż wcześniej, ale nie wszystkie błędy zmieniły się w wyjątki. – apokryfos

+0

W rzeczywistości można zdefiniować tylko 'set_error_handler()', ponieważ niezatłoczone wyjątki zostaną przekonwertowane na błędy krytyczne. – simon

Odpowiedz

4

Aaron Piotrowski (człowiek, który stworzył nowy system Error-Exception) ma great blog on this. Myślę, że kluczowym punktem trzeba zrozumieć, jest to

W PHP 7 wyjątek zostanie wyrzucony, gdy wystąpi błąd krytyczny i odzyskać (E_ERROR i E_RECOVERABLE_ERROR), zamiast zatrzymania wykonywania skryptu. Błędy krytyczne nadal występują w pewnych warunkach, takich jak wyczerpanie pamięci, i nadal zachowują się jak poprzednio, natychmiast zatrzymując wykonywanie skryptu. Niezatłoczony wyjątek będzie nadal stanowił błąd krytyczny w PHP 7. Oznacza to, że wyjątek wygenerowany z błędu, który był śmiertelny w PHP 5.x, jest niezmieniony, nadal będzie to błąd krytyczny w PHP 7.

Zauważ, że inne typy błędów, takie jak ostrzeżenia i powiadomienia, pozostają niezmienione w PHP 7. Tylko wyjątki mogą powodować błędy krytyczne i naprawialne.

W tym celu umieścić inny sposób uznają to

  • set_exception_handler() - Funkcja obsłużyć Exception s domyślnie (od PHP 7.0 może obsługiwać wszystkie Throwable s, więc może wychwycić błędy zwrotowi)
  • set_error_handler() - Funkcja do obsługi możliwych do odzyskania błędów:

Innymi słowy, ich funkcjonalność nie uległa zmianie. Wszystko, co wyzwala je w PHP5, uruchomi je w PHP7, po prostu możesz teraz użyć bloku try-catch na poziomie skryptu, aby poradzić sobie z określonym błędem.

+0

jest to ciekawy dodatek (jak wyjaśnia to, co stało się "Błąd"), ale nadal nie odpowiada bezpośrednio na pytanie. Oznacza to, że jeśli zdefiniuję 'set_exception_handler()' na PHP7, również nie muszę definiować procedury obsługi błędów, ponieważ wszystko zostanie przekierowane do obsługi wyjątku? – igorsantos07

+0

Możesz zrobić to w ten sposób, tak. 'Throwable' spowoduje wychwycenie' Error' i 'Exception' – Machavity

3

http://php.net/manual/en/language.errors.php7.php to warto przeczytać na ten temat:

PHP 7 zmienia się jak większość błędów zgłaszanych przez PHP. Zamiast zgłaszania błędów za pomocą tradycyjnego mechanizmu raportowania błędów używanego przez PHP 5, większość błędów jest zgłaszana przez zgłaszanie wyjątków błędów.

Tak jak w przypadku zwykłych wyjątków, wyjątki te będą pojawiać się w dymkach, dopóki nie dotrą do pierwszego pasującego bloku catch. Jeśli nie ma pasujących bloków, zostanie wywołana jakakolwiek domyślna procedura obsługi wyjątku zainstalowana z funkcją set_exception_handler(), a jeśli nie ma domyślnego programu obsługi wyjątku, wyjątek zostanie skonwertowany na błąd krytyczny i zostanie obsłużony jak tradycyjny błąd.

Oznacza to, że błędy nie są technicznymi wyjątkami, jednak mogą być przechwycone jako wyjątki (co jest fajną funkcją).

na przykład następujące powinny działać jak poprzednio:

set_error_handler('handleError'); 
try { 
    // raise error   
} catch (Exception $e) { 
    // won't catch error 
} 

Jednak następujące powinny być również możliwe

try { 
    // raise error   
} catch (Exception $e) { 
    // won't catch error 
} catch (Error $e) { 
     handleError(); 
} 
Powiązane problemy