Ich versuche, dieses Beispiel Nr. 1 von dieser Seite aus auszuführen: 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";
?>
Anstelle der gewünschten Ausgabe erhalte ich jedoch:
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
Die Entwicklerumgebung, die ich verwende, ist UniServer 3.5
mitPHP 5.2.3
Antworten:
Ich hatte genau dieses Problem, bei dem es so aussah, als hätte ich sogar den Namen der Ausnahme kopiert und es trotzdem nicht verstanden. Es stellte sich heraus, dass es mein dummer Fehler war, aber ich dachte, ich sollte meinen Fall hier posten, falls sich jemand anderes in der gleichen Situation befindet.
Ich hatte meine Ausnahme in meinem Namensraum genannt A und das Skript war in einem Namespace namens B . Das Problem war, dass ich A \ MyException hatte, die gleich (in PHP) \ B \ A \ MyException ist (weil sich mein Skript im Namespace B befindet !). Alles, was ich tun musste, um das Problem zu beheben, war, dem Ausnahmenamen einen Backslash (oder wie auch immer er heißt) hinzuzufügen, damit er so aussieht: \ A \ MyException
quelle
catch (\Exception $e)
. Ohne den BackslashException
ist der Namespace spezifisch und wird nicht abgeglichen (oder abgefangen).Eine ziemlich alte Frage, doch ...
Ich hatte auch dieses Problem (und so fand ich diesen Beitrag), aber nur ein einfaches Experiment ermöglichte es mir, die Lösung zu finden. Versuchen Sie einfach Wechsel
Exception
zu\Exception
. Hat für mich gearbeitet!BEARBEITEN:
Wie Sivann in den Kommentaren betonte, sollte die Verwendung des Namespace dasselbe tun. Stellen Sie es also einfach
use \Exception as Exception;
vor Ihre Klassenerklärung.quelle
use Exception;
sollte es einfach tunVersuchen Sie , setzen
catch(\Exception $e)
stattcatch(Exception $e)
. Wenn Sie einen Code verwenden, den Sie nicht sehr gut kennen, oder - insbesondere - wenn Sie ein Framework verwenden, überschreibt es möglicherweise die Standard-PHP-Ausnahme mit einer eigenen, und daher gehen Sie möglicherweise auf den falschen Pfad und erhalten das unerwünschte Ergebnis. Wenn Sie nur setzen\Exception
, dann sind Sie sicher, dass Sie die Basis-PHP-Ausnahme abfangen.quelle
Sie können die typischen try {} catch {} -Blöcke in PHP nicht wie in einer anderen Sprache wie C # (Csharp) verwenden.
Wenn du das tust:
Sie werden das "Verstanden!" Nicht sehen. Nachricht nie. Warum? Es ist nur so, weil PHP immer eine Ausnahme braucht, um "geworfen" zu werden. Sie müssen Ihren eigenen Fehlerbehandler festlegen und eine Ausnahme damit auslösen.
Siehe Funktion set_error_handler : http://php.net/manual/es/function.set-error-handler.php
quelle
$number = 5/0;
keine Ausnahme aus.$number
ist eingestellt zu seinINF
.Meine Initiale ist jedoch, dass Sie einen Tippfehler im Namen der Ausnahme haben, die Sie abfangen / auslösen, aber wenn Ihr Code genau der gleiche ist, bin ich mir nicht sicher, was genau los ist.
Versuchen Sie die folgende Änderung des ursprünglichen Skripts und fügen Sie Ihre Ergebnisse ein. Es wird Ihnen helfen, Ihr Problem ein bisschen besser zu diagnostizieren.
quelle
Ich hatte das gleiche Problem mit folgenden Konfigurationen:
PHP 5.2.14 (cli) (erstellt: 12. August 2010, 17:32:30 Uhr) Copyright (c) 1997-2010 Die PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2010 Zend Technologies mit eAccelerator v0.9.5. 1 , Copyright (c) 2004-2006 eAccelerator, von eAccelerator
Die Lösung besteht darin, eAccelerator entweder zu deaktivieren oder zu aktualisieren. Ich habe beide ausprobiert und beide Korrekturen haben funktioniert. Der Fehler wird hier https://eaccelerator.net/ticket/242 gemeldet (Hinweis: Firefox beschwert sich über das SSL-Zertifikat).
Jetzt laufe ich und versuche mit den folgenden Konfigurationen richtig zu fangen:
PHP 5.2.4 (cli) (erstellt: 16. Oktober 2007, 09:13:35 Uhr) Copyright (c) 1997-2007 Die PHP Group Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies mit eAccelerator v0.9.6. 1 , Copyright (c) 2004-2010 eAccelerator, von eAccelerator
quelle
\ Ausnahme funktioniert bei mir nicht, aber ich habe eine Lösung gefunden.
Ich musste try {} catch (Ausnahme $ e) {} durch try {} catch (Throwable $ e) {} ersetzen.
Für weitere Informationen: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
quelle
In Xdebug gibt es eine Einstellung:
Dies zwingt PHP, Ausnahmen auch in einem Try-Catch-Block auszugeben. Drehen Sie dies auf
0
quelle
Wenn Sie PHP 7 verwenden, benötigen Sie möglicherweise Throwable anstelle von Exception
quelle
Versuchen Sie möglicherweise, bestimmte Erweiterungen von Drittanbietern zu deaktivieren, die Sie möglicherweise installiert haben? http://bugs.php.net/bug.php?id=41744
quelle
TLDR; Stellen Sie sicher, dass Sie
use Exception;
oben auf beiden PHP-Dateien habenquelle
Ich erlebe das auch. Ich habe einen Kommentar von Rowinson Gallego gelesen, welcher Status Exception ausgelöst werden muss. Also habe ich meinen Code geändert von:
in:
Es klappt.
quelle