Melhorando mensagens de erro para erros de compilação XML

14

Magento é bastante protetor (como deveria ser) em relação à exibição de erros. Quando o modo de desenvolvedor está ativado (como deveria estar durante o desenvolvimento), o aplicativo permite que o feedback de erro em tempo de execução seja exibido pelo usuário. Para erros de compilação XML, embora esse feedback seja bastante inútil:

Erro fatal: exceção não capturada 'Exception' com a mensagem 'Aviso: simplexml_load_string (): Entidade: linha 4: erro do analisador: declaração XML permitida apenas no início do documento em [...] / lib / Varien / Simplexml / Config. php na linha 510 'em app / code / core / Mage / Core / functions.php na linha 245

Isso resulta da Varien_Simplexml_Config::loadFile()apresentação de ::loadString()uma sequência que não pode ser analisada:

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

Existem várias soluções em potencial, incluindo o uso libxml_use_internal_errors, mas o método de chamada não comunica o $filePathparâmetro, portanto o contexto seria perdido. Uma possibilidade seria lançar uma exceção mais explícita:

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

Isso fornece pelo menos uma saída como a seguinte:

Erro fatal: exceção não capturada 'Mage_Core_Exception' com a mensagem ' Varien_Simplexml_Config :: loadFile: erro ao analisar [...] / app / code / local / Some / Example / etc / config.xml : Aviso: simplexml_load_string (): Entidade: linha 4 : erro do analisador: declaração XML permitida apenas no início do documento em [...] / lib / Varien / Simplexml / Config.php na linha 534 'em [...] / app / Mage.php na linha 594

Existem algumas vantagens / desvantagens / abordagens alternativas a serem consideradas aqui?

benmarks
fonte
Sinto que um módulo da comunidade para melhorar algumas dessas mensagens de erro essenciais seria épico. A outra mensagem de erro que é muito ruim é quando ele não consegue encontrar um determinado phtml.
kalenjordan

Respostas:

14

A abordagem que eu sempre adoto é uma linha simples:

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

libxml2-utils necessário embora ...

Daniel Sloof
fonte
1
e mostra falsos positivos nos arquivos wsi:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Alex
Solução alternativa: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(sinta-se à vontade para editar a resposta) #
285 Alex Alex
Para config.xml: sou fã defind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks
@ Alex Estou recebendo o mesmo erro, você tem uma correção para isso?
Butterfly
Você tentou a linha que eu postei?
Alex