我正在使用JavaScript编写Windows边栏小工具。现在我希望捕获所有JavaScript异常并将其记录到文本文件中。一个问题是,当在任何行抛出异常时,下一行将不会被执行。是否可以自动捕获异常,以便可以执行以下JavaScript行。
以下示例代码演示了我的问题:
try
{
alert(document.getElementById("non-existing-element").value);
}
catch(ex)
{
}
alert("This is shown.");
alert(document.getElementById("non-existing-element").value);
alert("This is not shown.");
因此,一个大的try-catch-method允许记录错误,但其余的代码将不会被执行。 一种解决方案是捕获每一行的错误。但是数千行的代码太多了。 (或者我写了一个为我这样做的宏) 也许任何人都可以帮助我。
谢谢。
答案 0 :(得分:6)
您应该尝试构建适当的逻辑来控制错误,而不是尝试捕获错误。
var myEle = document.getElementById("non-existing-element")
if (myEle != null)
alert(dmyEle.value);
但是你正在描述抑制错误
您可以使用onerror事件处理程序来抑制JavaScript中的错误。
function handleErr(msg, url, line_no){
var errorMsg = "Error: " + msg + "\n";
errorMsg += "URL: " + url + "\n";
errorMsg += "Line: " + line_no + "\n\n";
alert(errorMsg);
return true;
}
// Set the global onerror;
onerror = handleErr;
更多信息here
答案 1 :(得分:3)
没有。例外总是传播到最接近的try
块,如果它没有try
且catch
正常退出,则会传播到finally
块之外。
JavaScript中没有可恢复的异常,因此无法声明单个全局异常处理程序并恢复所有异常。
答案 2 :(得分:2)
没有简单的解决方案,但如果你使用像jQuery这样的东西
$("#non-existing-element").attr('value')
会更好,因为当没有找到任何项目时,实现attr会返回任何内容。我相信这个哲学有一个名字,但我想不出来。
答案 3 :(得分:1)
您提出的“忽略例外”方法只有在您的所有例外都是非处理且可以被忽略时才有效。
一般情况并非如此捕获异常是一种流控制形式。你不想弄乱你的for循环,对吧?
异常行之后的代码很可能依赖于已正确执行的行。 (例如,有人可能想要使用.value
)
因此,您希望实现的最佳目标是查看您当前遇到的异常情况并调整调试。作为最初的例子,您是否只是遇到了未找到元素的问题?然后在使用节点之前添加null测试:
var node = document.getElementById('id');
if(!node) { /* inexisting element!*/ }
console.log('I dont have to worry about', node.value, 'now');
如果您的例外来自其他地方,那么也可能有类似的解决方案。
答案 4 :(得分:0)
你必须将每个部分包裹在try ... catch陷阱中。
另一种选择,使用jQuery,因为它不会在找不到元素时抛出异常:
$('.non-existing-element').val();