【问题标题】:Parse XML catch block not catching exception in JS解析 XML 捕获块未捕获 JS 中的异常
【发布时间】:2015-03-12 19:11:03
【问题描述】:

我有一个函数,它将 XML 文件(通过 AJAX 获得)作为输入,将其解析为 XML,然后在其上执行一些函数。可以在下面找到精简版。

AJAX

$.ajax({
    type: "GET",
    url: "./default.xml",
    dataType: "xml",
    success: function(data) {
        parseMech(data);
    }
});

parseMech 函数

function parseMech(xml) {
    try {
        var xmlObject = $(xml);

        // See the output function below
        $(".tree.base").html(treeBuilder(xmlObject.find("node").first()));

        console.log("succes?");
    } catch(e) {
        $("#error-msg > .the-msg").text(" Invalid XML structure").parent().fadeIn(250);
        console.log("Failed");
    }
}

treeBuilder 函数

function treeBuilder(nodes) {
    var newList = $("<ol>");

    nodes.each(function (x, e) {
        var newItem = $('<li><a href="#">&nbsp;</a></li>');

        for (var i = 0, l = e.attributes.length, a = null; i < l; i++) {
            // Don't forget to add properties as data-attributes
            a = e.attributes[i];
            newItem.attr("data-" + a.nodeName, a.value);
            if (a.nodeName == "cat" || a.nodeName == "word") {
                newItem.html('<a href="#">' + a.value + '</a>');
            }
        }
        if ($(this).children('node').length) {
            newItem.append(output($(this).children('node')));
        }
        newList.append(newItem);
    });
    return newList;
}

default.xml 是一个有效的 xml 文件时,这将正常工作。但是,当它不是时(例如,当我省略了结束标签时)catch 块不会执行。换句话说:当以无效的 XML 作为源执行所有函数时,不会执行任何控制台日志,即使您希望至少记录一个(trycatch)。

我错过了什么吗?

【问题讨论】:

  • 您是否尝试将fail 处理程序添加到您的ajax 调用?
  • 你可以看看DomParser
  • @collapsar 不是只有在 ajax 加载失败时才有效吗? XML 解析只发生在parseMech()
  • @JacqueGoupil 不幸的是我需要 IE8 支持。
  • @BramVanroy IE 有一个 ActiveX Dom 解析器,不确定 IE8 是否有它w3schools.com/xml/xml_parser.asp

标签: javascript jquery ajax xml try-catch


【解决方案1】:

您的 ajax 调用中需要一个 fail 处理程序。

根据docs,dataType为xml的jquery ajax调用返回一个xml doc,所以在ajax调用的过程中正在解析数据流。

如下改变 ajax 调用(行为验证):

    //...
    error: function() {
        console.log("ajax failed!");
    },
    //...

注意

考虑更改指定处理程序的方式,因为 errorsuccess 属性已被弃用:

top.$.ajax({
    type: "GET",
    url: url,
    crossDomain: true,
    dataType: "xml",
})
    .fail ( function() {
        console.log("ajax failed!");
    })
    .done ( function(data) {
        console.log("ajax ok!");
        parseMech(data);
    });

【讨论】:

  • 谢谢!我一直想知道error 和fail 之间的区别是什么。
猜你喜欢
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多