抛出异常时不要停止JavaScript

时间:2011-07-29 19:26:58

标签: javascript exception try-catch

我正在使用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允许记录错误,但其余的代码将不会被执行。 一种解决方案是捕获每一行的错误。但是数千行的代码太多了。 (或者我写了一个为我这样做的宏) 也许任何人都可以帮助我。

谢谢。

5 个答案:

答案 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块,如果它没有trycatch正常退出,则会传播到finally块之外。

JavaScript中没有可恢复的异常,因此无法声明单个全局异常处理程序并恢复所有异常。

答案 2 :(得分:2)

没有简单的解决方案,但如果你使用像jQuery这样的东西

$("#non-existing-element").attr('value') 

会更好,因为当没有找到任何项目时,实现attr会返回任何内容。我相信这个哲学有一个名字,但我想不出来。

答案 3 :(得分:1)

您提出的“忽略例外”方法只有在您的所有例外都是非处理可以被忽略时才有效。

一般情况并非如此
  1. 捕获异常是一种流控制形式。你不想弄乱你的for循环,对吧?

  2. 异常行之后的代码很可能依赖于已正确执行的行。 (例如,有人可能想要使用.value

  3. 因此,您希望实现的最佳目标是查看您当前遇到的异常情况并调整调试。作为最初的例子,您是否只是遇到了未找到元素的问题?然后在使用节点之前添加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();