Улучшение сообщений об ошибках XML ошибок компиляции

14

Magento довольно защищен (как и должно быть) в отношении отображения ошибок. Когда включен режим разработчика (как и должно быть во время разработки), приложение позволяет пользователю получать сообщения об ошибках во время выполнения. Для ошибок компиляции XML эта обратная связь довольно бесполезна:

Неустранимая ошибка: необработанное исключение «Исключение» с сообщением «Предупреждение: simplexml_load_string (): Сущность: строка 4: ошибка синтаксического анализатора: объявление XML допускается только в начале документа в [...] / lib / Varien / Simplexml / Config. php в строке 510 'в [...] приложении / коде / core / Mage / Core / functions.php в строке 245

Это результат Varien_Simplexml_Config::loadFile()представления ::loadString()строки, которая не может быть проанализирована:

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

Существует несколько потенциальных решений, включая использование libxml_use_internal_errors, но вызывающий метод не передает $filePathпараметр, поэтому контекст может быть потерян. Одной из возможностей было бы создание более явного исключения:

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

По крайней мере, это обеспечивает вывод, подобный следующему:

Неустранимая ошибка: необработанное исключение «Mage_Core_Exception» с сообщением « Varien_Simplexml_Config :: loadFile: ошибка анализа [...] / app / code / local / Some / Example / etc / config.xml : Предупреждение: simplexml_load_string (): Entity: строка 4 : parser error: объявление XML разрешено только в начале документа в [...] / lib / Varien / Simplexml / Config.php в строке 534 'в [...] / app / Mage.php в строке 594

Есть ли здесь какие-то преимущества / недостатки / альтернативные подходы?

benmarks
источник
Я чувствую, что модуль сообщества для улучшения некоторых из этих плохих основных сообщений об ошибках будет эпическим. Другое сообщение об ошибке, которое действительно плохо, - когда он не может найти данный phtml.
Календжордан

Ответы:

14

Подход, который я всегда использую, прост: одна строка:

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

libxml2-utils требуется, хотя ...

Дэниел Слооф
источник
1
и показывает ложные срабатывания в файлах WSI:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Алекс
Обходной путь: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(не стесняйтесь редактировать ответ)
Алекс
Для config.xml: я фанатfind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks
@ Алекс, я получаю ту же ошибку, у тебя есть решение для этого?
Butterfly
Вы пробовали линию, которую я отправил?
Алекс