Parse XML catch 块没有捕获 JS 中的异常
Parse XML catch block not catching exception in JS
我有一个函数将 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="#"> </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 作为源执行所有函数时,不会执行控制台日志,即使您期望至少有一个(在 try
或 catch
中)被执行已记录。
我是不是漏掉了什么?
您的 ajax 调用中需要一个 fail
处理程序。
根据 docs,jquery ajax 调用的数据类型为 xml returns xml 文档,因此ajax 调用过程中正在解析数据流。
按如下方式更改 ajax 调用(行为已验证):
//...
error: function() {
console.log("ajax failed!");
},
//...
注
考虑更改指定处理程序的方式,因为 error
和 success
属性已弃用:
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);
});
我有一个函数将 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="#"> </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 作为源执行所有函数时,不会执行控制台日志,即使您期望至少有一个(在 try
或 catch
中)被执行已记录。
我是不是漏掉了什么?
您的 ajax 调用中需要一个 fail
处理程序。
根据 docs,jquery ajax 调用的数据类型为 xml returns xml 文档,因此ajax 调用过程中正在解析数据流。
按如下方式更改 ajax 调用(行为已验证):
//...
error: function() {
console.log("ajax failed!");
},
//...
注
考虑更改指定处理程序的方式,因为 error
和 success
属性已弃用:
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);
});