改善XML编译错误的错误消息


14

Magento在错误显示方面具有应有的保护作用。启用开发人员模式时(在开发过程中应该如此),该应用程序允许运行时错误反馈冒泡给用户。对于XML编译错误,尽管此反馈相当无用:

致命错误:消息“警告”的未捕获异常“异常”:实体:第4行:解析器错误:仅在[/] / lib / Varien / Simplexml / Config中的文档开头才允许XML声明。 daccess-ods.un.org daccess-ods.un.org在第245行的app / code / core / Mage / Core / functions.php中的510'行上的php

这是由于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);
}

有几种可能的解决方案,包括using 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()
            )
        );
    }
}

这至少提供如下输出:

致命错误:消息为“ Varien_Simplexml_Config :: loadFile:解析错误[/]/app/code/local/Some/Example/etc/config.xml的未捕获异常'Mage_Core_Exception' :警告:simplexml_load_string():实体:第4行:解析器错误:仅在文档开头的[...] / lib / Varien / Simplexml / Config.php的第534行的[...] / app / Mage.php的XML声明

这里是否有一些优点/缺点/替代方法要考虑?


我觉得像一个社区模块来改善其中一些不良的核心错误消息将是史诗般的。另一个非常糟糕的错误消息是找不到指定的phtml时。
kalenjordan

Answers:


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
Alex

解决方法:(find . -type f -not -name 'wsi.xml' -not -name 'wsdl.xml' -not -name 'wsdl2.xml' -name '*.xml' -exec xmllint --noout {} \;随时编辑答案)
Alex

对于config.xml:我是find . -type f -name 'config.xml' -exec xmllint --noout {} \;
Benmarks 2013年

@Alex我遇到了同样的错误,您是否已解决此问题?
蝴蝶

您是否尝试过我发布的线路?
亚历克斯(Alex)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.