如何在javascript / jquery中跳过或忽略错误?

29

假设我这样调用3个 JavaScript(jQuery)文件:

<script type="text/javascript" src="js/file1.js"></script>
<script type="text/javascript" src="js/file2.js"></script>
<script type="text/javascript" src="js/file3.js"></script>

file2.js 中存在脚本错误(或者某个函数出现问题):例如,它会提示“函数不存在”。由于 file2.js 中存在错误,因此无法执行 file3.js 中的脚本。

是否有方法确保仍然可以执行 file3.js 中的脚本?或者,是否有可能绕过或忽略 file2.js 上的错误?


3
try/catch用于捕获异常,但实际上您应该修复潜在问题。 - Matt Ball
如果你知道有错误,但拒绝修复它们,为什么还要包含该文件?很可能由于这些错误,该文件的大部分代码都无法正常运行。 - aug
可能是忽略页面中的JavaScript语法错误并继续执行脚本的重复问题。 - Ciro Santilli OurBigBook.com
6个回答

40

你可以在出错的代码周围使用try-catch块

try{

//code that causes an error

}catch(e){

functionToHandleError(e);
}
//continue from here

但只有在错误是外部库中已知的条件/无法避免的问题或仅在出现不良用户输入时才应该这样做。不应该使用它以任何代价让程序保持运行。

避免错误的一些方法

  • 在调用函数之前检查函数是否存在
  • 在引用对象属性之前检查对象是否存在
  • 如果涉及用户输入,请验证输入以检查其是否符合预期的类型/范围等
  • 如果这是一个加载顺序问题,请考虑重新排列脚本,或者如果这是一个较大的应用程序,则使用类似于requireJS的依赖管理系统
  • 如果异步请求后对象未定义,请记住代码不会等待异步请求,直到之后它才被定义。 处理提供值的代码应在回调函数或使用deffereds / promises中完成。
  • 如果您正在引用DOM元素,请考虑从在DOM加载时运行的函数开始编写JS代码,例如jQuery的document.ready或本机的window.onload。
  • 如果声明了JavaScript变量而没有var关键字,或者将其附加到全局对象,则可能会在其声明位置以外的地方进行修改。 JavaScript也没有块作用域。 确保您知道所有修改变量的位置,并尽可能限制变量的范围。 特别是避免使用太多全局变量来保存状态,因为可能需要进行许多null / type检查才能知道当前状态。

处理错误的一些方法

  • 如果这是一个预期的问题(例如,如果输入可能为空并需要不同的处理),最好提前使用if语句检查它。 如果您不想这样做,则可以使用try / catch将其转换,要求新输入或根据适当情况处理给定的输入。

  • 如果这是意外的问题(例如,您不知道发生了什么),则捕获块可以是开发过程中输出诊断信息的好地方。 例如,请勿仅捕获然后使其无声失败,输出消息以让您或其他开发人员知道它失败的位置,然后使用您喜欢的浏览器的Web开发人员工具在那个时间点检查值,找出发生了什么,并添加处理该情况以修复它。

不要这样做

  • 放入try / catch,然后让程序继续运行。 如果未正确运行的代码是不必要的,请摆脱它。 如果它是必需的且未正常工作,请修复它。

  • 将try / catch用作输入验证(例如,如果函数为null,则它将引发异常,然后我知道函数为null)。 可能情况下,请检查任何预期的错误。 当行为不寻常并且需要进入替代代码路径或向用户警告某些错误时,try / catch应处理“异常”。


它在异步调用中不起作用。我已经思考了很长时间,想捕获由React中的异步调用调用的函数抛出的异常 :( - Ankur Parihar

17

当你没有时间进行调试时,请尝试以下方法:

function stoperror() {
   return true;
}

称之为:

window.onerror = stoperror;

功能非常简单:创建一个始终返回true的函数,然后每当出现错误时,调用此函数(返回true并抑制错误)。


1
它无法正常工作,出现了“Uncaught TypeError: Cannot read property 'remove' of undefined”错误。这是我的代码:var rows = document.getElementsByTagName("tr"); for (i=0; i < rows.length; i++){ rows[i].childNodes[0].remove(); } - Shayan

5

您可以使用try和catch语句。通过使用!= null条件来检查null。

try{


}catch(e){

}

3

将导致错误的调用放在try...catch块中:

try {
   callNonExistentMethod();
}
catch (e) {
   //Handle the error if you wish.
}

3

通过使用这个方法,您可以避免"function is undefined"错误。

//Simple function that will tell if the function is defined or not
function is_function(func) {
    return typeof window[func] !== 'undefined' && $.isFunction(window[func]);
}

//usage

if (is_function("myFunction") {
    alert("myFunction defined");
} else {
    alert("myFunction not defined");
}

1
我建议在假设对象(包括函数)存在之前,添加适当的空值检查,以使代码能够优雅地失败。
以下是一些想法: JavaScript 检查函数是否存在

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接