Gute Frage +1
Habe nach meiner Diskussion mit @mpw über meine erste Antwort einige Nachforschungen und Tests nach einem guten Punkt in der Richtung durchgeführt. Ich habe es das erste Mal teilweise falsch verstanden.
Fügt zur Verdeutlichung einige Codes hinzu, damit andere das Problem besser verstehen.
Eine Notiz vor dem Start
Ich hatte nie solche Probleme, bis dies auftauchte. Entwickeln in Magento mit aktiviertem Entwicklermodus Ich denke keine Sekunde darüber nach. Jedes Mal , wenn ich furz , wird es angezeigt und dementsprechend korrigiert.
Das Problem mit einem erklärenden Beispiel
Ihre schwerwiegenden Fehler werden protokolliert (falls aktiviert) und der Code wird wie gewohnt fortgesetzt, da kein Fehler von mageCoreErrorHandler
oder durch das Programm ausgelöst wird exit
.
Erster Magento-Fehlerbehandler für nicht behebbare Fehler app/code/core/Mage/Core/functions.php
/**
* Custom error handler
*
* @param integer $errno
* @param string $errstr
* @param string $errfile
* @param integer $errline
*/
function mageCoreErrorHandler($errno, $errstr, $errfile, $errline){
/**
* Some internal logic here for building the error message
*/
$errorMessage .= ": {$errstr} in {$errfile} on line {$errline}";
if (Mage::getIsDeveloperMode()) {
throw new Exception($errorMessage);
} else {
Mage::log($errorMessage, Zend_Log::ERR);
}
}
Wie Sie sehen, wird im Entwicklermodus etwas Nützliches angezeigt und ein Fehler ausgegeben. Wenn es ausgeschaltet ist, wird es protokolliert (falls aktiviert) und fortgesetzt.
Der Beweis
Meine testfile.php
require 'app/Mage.php';
Mage::app('admin')->setUseSessionInUrl(false);
// Test function which expect Customer_Model_Customer
function test(Customer_Model_Customer $customer)
{
var_dump('Do not show me because ' . get_class($customer) . ' is not a customer.');
}
// Enabled developer mode
Mage::setIsDeveloperMode(true);
// Put a var in here
$noGood = Mage::app();
// Make some context
var_dump('hello');
try {
// Call test function with a not accepted var
test($noGood);
// Tell if we get here
var_dump('And we are here!');
} catch (Exception $e) {
var_dump('You should die, because I am doing something which I should not do');
}
Das Ergebnis
Entwicklermodus aktiviert. Richtiges Ergebnis
string(5) "hello"
string(66) "You should die, because I am doing something which I should not do"
Entwicklermodus deaktiviert, falsches Ergebnis
string(5) "hello"
string(61) "Do not show me because Mage_Core_Model_App is not a customer."
string(16) "And we are here!"
Daher wird der Fehler möglicherweise übersprungen und in der nächsten Codezeile fortgefahren. Vielleicht mit noch seltsameren Ergebnissen. (wie @mpw darauf hinweist)
Fazit
Es könnte passieren , dass jemand in einer Art und Weise zu entwickeln , dass Fehler gehen unbemerkt und es wird schließlich zu unerwarteten Ergebnissen führen.
Natürlich, wenn man sich professionell entwickelt. Fehler werden bemerkt und Aufmerksamkeit geschenkt. Die Möglichkeit, dies in Magento zu verhindern, besteht immer darin, den Entwicklungsmodus in einer Entwickler- / Testumgebung zu aktivieren.
IMHO sollte es nie zu diesem Punkt der Diskussion kommen, an dem das Überprüfen einer Variablen ein zweites Mal (zumindest würde ich es so beschreiben) der richtige Weg ist. Code sollte vor der Freigabe in Produktionsumgebungen getestet werden. Es sollte nicht benötigt werden.
Bedenken
Vielleicht sollte Magento nach einem schwerwiegenden Fehler aufhören. Oder generieren Sie einen Bericht und zeigen Sie ihn dem Besucher. Auf diese Weise werden die nächsten Codezeilen niemals ausgeführt und Dinge werden bemerkt.
Gute Frage. Ich denke, dies ist ein generelles Problem
E_RECOVERABLE_ERROR
in PHP.Was Sie in Ihrer Frage haben, ist die Ausnahmebehandlung, nicht die Fehlerbehandlung. Der Fehlerbehandler verursacht das eigentliche Problem, das Sie hier besprechen, mit auffindbaren schwerwiegenden Fehlern (
E_RECOVERABLE_ERROR
) .PHP 7 und HHVM haben dies bereits gelöst.
Es ist schlimmer mit Magento, weil der Error-Handler dies seit PHP 5.2 Fehlerklasse nicht mehr behandelt.
Eine nützlichere Art der Fehlerbehandlung wäre es, sich mit dieser Fehlerklasse zu befassen und diese Fehler in ErrorException s umzuwandeln . Beispiel (nicht von mir, von hier ):
So im Licht von Magento, die Standard - Fehlerbehandlung ist die globale Funktion
mageCoreErrorHandler
inapp/code/core/Mage/Core/functions.php
. Es wird überMage::app()
dieinit()
Methode der Mage_Core_Model_App (app/code/core/Mage/Core/Model/App.php
) (über eine geschützte_initEnvironment()
Methode) registriert .Ein Beobachter, auf
controller_front_init_before
dem Ihr eigener PHP-Error-Handler registriert ist, sollte dann ausreichen (Error-Handler in PHP sind stapelbar):Abfangbare schwerwiegende Fehler werden dann zu Ausnahmen und Sie können sie in Ihrem eigenen Erweiterungscode behandeln oder sie werden nicht abgefangen und im Ausnahmeprotokoll angezeigt (anstatt Ihren Shop auf falschen Typen laufen zu lassen, wie es das aktuelle Verhalten ist, tote Programme) lüge nicht ). In PHP 7 ist die Ausnahme, nach der gesucht werden muss, nicht ErrorException, sondern TypeException (eine BaseException ) für die jetzt auffindbaren schwerwiegenden Fehler .
Alle anderen Fehler werden an den Fehlerbehandler von Magento weitergeleitet.
Hinweis: Ich habe dies nicht ausprobiert, es ist eine Zusammenfassung, aber ich kenne das Problem, nach dem Sie fragen, und die Fehlerbehandlungsanalyse wurde mit 1.5.1.0 durchgeführt und mit 1.9.1.0 durch Codeanalyse überprüft. Das Stapeln der Fehlerbehandlungsroutine sollte funktionieren. Ich füge einen kleinen erweiterten Beispielcode an, der die meisten Teile der Arbeit demonstriert.
Ich habe dies noch nicht als Magento-Erweiterung gepackt, aber es sollte mit Modman einfach sein. Ich werde es dann auf Github setzen.
Anhang: Fehlerbehandlungs-Demo
Das folgende Codebeispiel ( Online-Demo ) veranschaulicht das Stapeln von Fehlerbehandlungsroutinen und das Auslösen von Ausnahmen bei abfangbaren schwerwiegenden Fehlern :
Programmausgabe
quelle
Es wird bereits standardmäßig von PHP verarbeitet, indem es
(Exception $e)
in die Funktionsparameterdefinition eingefügt wird.Sie können dieser Funktion nichts anderes als eine Ausnahme oder eine Erweiterung der Ausnahme übergeben.
quelle
mageCoreErrorHandler
Funktion an. Ein durch falsche Parameter ausgelöster Fehler wird im Nicht-Entwicklermodus behandelt und unterdrückt und im Entwicklermodus ausgelöstException
.mageCoreErrorHandler
sicherstellen, dass den Besuchern kein Fehler ins Gesicht geworfen wird. Sie könnten eine eigene bauentry{}catch(){}
, um sie sich selbst zu schnappen, und wenn Sie sie nicht weitergeben können.