Verbesserte Fehlermeldungen bei XML-Kompilierungsfehlern

14

Magento ist ziemlich schützend (wie es sein sollte) hinsichtlich der Anzeige von Fehlern. Wenn der Entwicklermodus aktiviert ist (wie es während der Entwicklung sein sollte), lässt die Anwendung eine Laufzeitfehlerrückmeldung an den Benutzer zu. Für XML-Kompilierungsfehler ist dieses Feedback jedoch ziemlich nutzlos:

Schwerwiegender Fehler: Ungefangene Ausnahme 'Ausnahme' mit der Meldung 'Warnung: simplexml_load_string (): Entität: Zeile 4: Parser-Fehler: XML-Deklaration nur am Anfang des Dokuments in [...] / lib / Varien / Simplexml / Config zulässig. php on line 510 'in [...] app / code / core / Mage / Core / functions.php on line 245

Dies ergibt sich aus der Varien_Simplexml_Config::loadFile()Darstellung ::loadString()mit einer Zeichenfolge, die nicht analysiert werden kann:

public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    return $this->loadString($fileData, $this->_elementClass);
}

Es gibt mehrere mögliche Lösungen, einschließlich der Verwendung libxml_use_internal_errors, aber die aufrufende Methode kommuniziert den $filePathParameter nicht, sodass der Kontext verloren gehen würde. Eine Möglichkeit wäre, eine explizitere Ausnahme auszulösen:

public function loadFile($filePath)
{
    if (!is_readable($filePath)) {
        //throw new Exception('Can not read xml file '.$filePath);
        return false;
    }

    $fileData = file_get_contents($filePath);
    $fileData = $this->processFileData($fileData);
    try{
        return $this->loadString($fileData, $this->_elementClass);
    }
    catch (Exception $e){
        Mage::throwException (
            sprintf(
                "%s: error parsing %s:\r\n%s",
                __METHOD__,
                $filePath,
                $e->getMessage()
            )
        );
    }
}

Dies liefert zumindest eine Ausgabe wie die folgende:

Schwerwiegender Fehler: Ungefangene Ausnahme 'Mage_Core_Exception' mit der Meldung ' Varien_Simplexml_Config :: loadFile: Fehler beim Parsen von [...] / app / code / local / Some / Example / etc / config.xml : Warnung: simplexml_load_string (): Entität: Zeile 4 : Parser-Fehler: XML-Deklaration nur am Anfang des Dokuments in [...] / lib / Varien / Simplexml / Config.php in Zeile 534 'in [...] / app / Mage.php in Zeile 594 zulässig

Gibt es hier einige Vor- / Nachteile / alternative Ansätze zu berücksichtigen?

benmarks
quelle
Ich fühle mich wie ein Community-Modul, um einige dieser schlechten Kernfehlermeldungen zu verbessern, wäre episch. Die andere Fehlermeldung, die wirklich schlecht ist, ist, wenn ein bestimmtes HTML nicht gefunden werden kann.
Kalenjordan

Antworten:

14

Der Ansatz, den ich immer verfolge, ist ein einfacher Einzeiler:

find . -type f -name '*.xml' -exec xmllint --noout {} \;

libxml2-utils werden allerdings benötigt ...

Daniel Sloof
quelle
1
und zeigt falsche Positive in den wsi-Dateien:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Alex
Problemumgehung: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(Sie können die Antwort jederzeit bearbeiten)
Alex
Für config.xml: Ich bin ein Fan vonfind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks
@Alex Ich bekomme den gleichen Fehler, hast du das Problem behoben?
Schmetterling
Hast du die Zeile ausprobiert, die ich gepostet habe?
Alex