Amélioration des messages d'erreur pour les erreurs de compilation XML

14

Magento est assez protecteur (comme il se doit) concernant l'affichage des erreurs. Lorsque le mode développeur est activé (comme il devrait l'être pendant le développement), l'application permet à l'utilisateur de faire remonter les informations sur les erreurs d'exécution. Pour les erreurs de compilation XML, ces commentaires sont assez inutiles:

Erreur fatale: exception non interceptée 'Exception' avec le message 'Avertissement: simplexml_load_string (): Entité: ligne 4: erreur de l'analyseur: déclaration XML autorisée uniquement au début du document dans [...] / lib / Varien / Simplexml / Config. php en ligne 510 'dans app / code / core / Mage / Core / functions.php en ligne 245

Cela résulte de la Varien_Simplexml_Config::loadFile()présentation ::loadString()d'une chaîne qui ne peut pas être analysée:

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);
}

Il existe plusieurs solutions potentielles, y compris l'utilisation libxml_use_internal_errors, mais la méthode d'appel ne communique pas le $filePathparamètre, donc le contexte serait perdu. Une possibilité serait de lever une exception plus explicite:

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()
            )
        );
    }
}

Cela fournit au moins une sortie comme celle-ci:

Erreur fatale: exception non interceptée 'Mage_Core_Exception' avec le message ' Varien_Simplexml_Config :: loadFile: erreur d'analyse [...] / app / code / local / Some / Example / etc / config.xml : avertissement: simplexml_load_string (): entité: ligne 4 : erreur de l'analyseur: déclaration XML autorisée uniquement au début du document dans [...] / lib / Varien / Simplexml / Config.php sur la ligne 534 'dans [...] / app / Mage.php sur la ligne 594

Y a-t-il des avantages / inconvénients / approches alternatives à considérer ici?

Benmarks
la source
Je pense qu'un module communautaire pour améliorer certains de ces mauvais messages d'erreur de base serait épique. L'autre message d'erreur qui est vraiment mauvais, c'est quand il ne peut pas trouver un phtml donné.
kalenjordan

Réponses:

14

L'approche que je prends toujours est une simple ligne:

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

libxml2-utils requis cependant ...

Daniel Sloof
la source
1
et montre des faux positifs dans les fichiers wsi:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Alex
Solution: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(n'hésitez pas à modifier la réponse)
Alex
Pour config.xml: je suis fan defind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks
@Alex, je reçois la même erreur, avez-vous une solution pour cela?
Butterfly
Avez-vous essayé la ligne que j'ai publiée?
Alex