Próbuję uruchomić ten przykład nr 1 z tej strony: http://php.net/manual/en/language.exceptions.php
<?php
function inverse($x) {
if (!$x) {
throw new Exception('Division by zero.');
}
return 1/$x;
}
try {
echo inverse(5) . "\n";
echo inverse(0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
// Continue execution
echo "Hello World\n";
?>
Jednak zamiast żądanego wyniku otrzymuję:
0.2
Fatal error: Uncaught exception 'Exception' with message 'Division by zero.'
in xxx:
7 Stack trace: #0 xxx(14): inverse(0) #1 {main} thrown in xxx on line 7
Środowisko deweloper używam jest UniServer 3.5
zPHP 5.2.3
Odpowiedzi:
Właśnie miałem ten dokładny problem, w którym wydawało się, że nawet skopiowałem nazwę wyjątku, a jednak go nie złapałem. Okazało się, że to mój głupi błąd, ale pomyślałem, że powinienem tutaj zamieścić swoją sprawę na wypadek, gdyby był ktoś w takiej samej sytuacji.
Miałem wyjątek w moim nazw nazwie i skrypt był w przestrzeni nazw o nazwie B . Problem polegał na tym, że miałem A \ MyException, który jest równy (w PHP) \ B \ A \ MyException (ponieważ mój skrypt znajduje się w przestrzeni nazw o nazwie B !). Wszystko, co musiałem zrobić, aby to naprawić, to dodać ukośnik odwrotny (lub jak to się nazywa) do nazwy wyjątku, aby wyglądał tak: \ A \ MyException
źródło
catch (\Exception $e)
. Bez odwrotnego ukośnikaException
jest specyficzna dla przestrzeni nazw i nie zostanie dopasowana (ani złapana).Dość stare pytanie, ale ...
Ja też miałem ten problem (i tak znalazłem ten post), ale prosty eksperyment pozwolił mi znaleźć rozwiązanie. Po prostu spróbuj zmienić
Exception
na\Exception
. Pracował dla mnie!EDYTOWAĆ:
Jak zauważył Sivann w komentarzach, użycie przestrzeni nazw powinno zrobić to samo. Więc po prostu umieść
use \Exception as Exception;
przed deklaracją klasy.źródło
use Exception;
powinienem to zrobićSpróbuj
catch(\Exception $e)
zamiast tegocatch(Exception $e)
. Jeśli używasz kodu, o którym nie znasz zbyt dobrze, lub - szczególnie - jeśli używasz frameworka, może on zastąpić domyślny wyjątek PHP jednym z własnych, a zatem możesz przejść do złej ścieżki i uzyskać niepożądany wynik. Jeśli po prostu wstawisz\Exception
, jesteś pewien, że przechwytujesz wyjątek podstawowy PHP.źródło
Nie możesz użyć typowych bloków try {} catch {} w PHP, tak jak możesz to zrobić w innym języku, takim jak C # (Csharp).
Jeśli to zrobisz:
Nie zobaczysz komunikatu „Rozumiem!” wiadomość nigdy. Czemu? Dzieje się tak dlatego, że PHP zawsze potrzebuje wyjątku, aby został „wyrzucony”. Musisz ustawić własny program obsługi błędów i zgłosić z nim wyjątek.
Zobacz funkcję set_error_handler : http://php.net/manual/es/function.set-error-handler.php
źródło
$number = 5/0;
nie zgłasza wyjątku.$number
jest ustawionyINF
.Moja inicjał jest jednak taki, że masz literówkę w nazwie wyjątku, który wychwytujesz / rzucasz, ale jeśli twój kod jest dokładnie taki sam, nie jestem pewien, co się dzieje.
Wypróbuj następującą modyfikację oryginalnego skryptu i wklej wyniki. Pomoże to nieco lepiej zdiagnozować problem.
źródło
Miałem ten sam problem z kolejnymi konfiguracjami,
PHP 5.2.14 (cli) (zbudowano: 12 sierpnia 2010 17:32:30) Copyright (c) 1997-2010 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies with eAccelerator v0.9.5. 1 , Copyright (c) 2004-2006 eAccelerator, by eAccelerator
Rozwiązaniem jest albo wyłączenie eAcceleratora, albo jego aktualizacja. Wypróbowałem oba i obie poprawki zadziałały. Błąd został zgłoszony tutaj https://eaccelerator.net/ticket/242 (uwaga: firefox narzeka na swój certyfikat SSL).
Teraz uruchamiam spróbuj złapać poprawnie z następującymi konfiguracjami,
PHP 5.2.4 (cli) (zbudowany: 16 października 2007 09:13:35) Copyright (c) 1997-2007 The PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies with eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, by eAccelerator
źródło
\ Wyjątek nie działa dla mnie, ale znalazłem rozwiązanie.
Musiałem zamienić try {} catch (Exception $ e) {} na try {} catch (Throwable $ e) {}.
Więcej informacji: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
źródło
w Xdebug jest ustawienie:
Zmusi to php do wypisywania wyjątków nawet w bloku try catch. Włącz to
0
źródło
Jeśli używasz PHP 7, możesz potrzebować Throwable zamiast Exception
źródło
Może spróbuj wyłączyć niektóre rozszerzenia innych firm, które mogłeś zainstalować? http://bugs.php.net/bug.php?id=41744
źródło
TLDR; upewnij się, że masz
use Exception;
na górze oba pliki phpźródło
Ja też tego doświadczam. Przeczytałem komentarz Rowinsona Gallego, który stwierdza, że należy wyrzucić wyjątek. Więc zmodyfikowałem mój kod z:
w :
To działa.
źródło