Poprawianie komunikatów o błędach dotyczących błędów kompilacji XML


14

Magento jest dość ochronny (tak jak powinien) pod względem wyświetlania błędów. Gdy tryb programisty jest włączony (tak jak powinien być podczas programowania), aplikacja pozwala na przesłanie komunikatu zwrotnego dotyczącego błędu środowiska wykonawczego do użytkownika. W przypadku błędów kompilacji XML ta opinia jest jednak bezużyteczna:

Błąd krytyczny: nieprzechwycony wyjątek „Wyjątek” z komunikatem „Ostrzeżenie: simplexml_load_string (): Obiekt: wiersz 4: błąd analizatora składni: deklaracja XML dozwolona tylko na początku dokumentu w [...] / lib / Varien / Simplexml / Config. php na linii 510 'w [...] aplikacji / code / core / Mage / Core / functions.php na linii 245

Wynika to z Varien_Simplexml_Config::loadFile()prezentacji ::loadString()ciągu, którego nie można przeanalizować:

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

Istnieje kilka potencjalnych rozwiązań, w tym użycie libxml_use_internal_errors, ale metoda wywołania nie przekazuje $filePathparametrów, więc kontekst zostałby utracony. Jedną z możliwości byłoby wprowadzenie bardziej wyraźnego wyjątku:

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

Zapewnia to co najmniej następujące wyniki:

Błąd krytyczny: nieprzechwycony wyjątek „Mage_Core_Exception” z komunikatem „ Varien_Simplexml_Config :: loadFile: parsowanie błędów [...] / app / code / local / Some / Example / etc / config.xml : Ostrzeżenie: simplexml_load_string (): Entity: wiersz 4 : błąd analizatora składni: deklaracja XML jest dozwolona tylko na początku dokumentu w [...] / lib / Varien / Simplexml / Config.php w linii 534 'w [...] / app / Mage.php w linii 594

Czy są tu jakieś zalety / wady / alternatywne podejścia?


Wydaje mi się, że moduł społecznościowy służący do poprawy niektórych komunikatów o błędach podstawowych rdzeni byłby niesamowity. Innym błędnym komunikatem o błędzie jest to, że nie można znaleźć danego pliku phtml.
kalenjordan

Odpowiedzi:


14

Podejście, które zawsze wybieram, jest proste, jedno-liniowe:

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

Wymagane libxml2-utils ...


1
i pokazuje fałszywe trafienia w plikach wsi:namespace error : xmlns:typens: 'urn:{{var wsdl.name}}' is not a valid URI
Alex

Obejście: find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;(edytuj odpowiedź)
Alex

Dla config.xml: Jestem fanemfind . -type f -name 'config.xml' -exec xmllint --noout {} \;
benmarks

@Alex Otrzymuję ten sam błąd, czy masz to naprawić?
Motyl

Próbowałeś linii, którą opublikowałem?
Alex
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.