Javascript 在闭包上下文中抛出错误不会到达catch子句

Javascript 在闭包上下文中抛出错误不会到达catch子句,javascript,node.js,Javascript,Node.js,我在闭包上下文中抛出了一个异常,但无法捕获它。这里有一个简单的例子 try{ setTimeout(function(){ throw Error() },100) } catch(error) { console.log("YES",error); } 它从未到达catch子句,并导致我的节点进程终止。同样的问题: try{ setTimeout(function(){undefinedMethod() },100) } catch(error) { console.lo

我在闭包上下文中抛出了一个异常,但无法捕获它。这里有一个简单的例子

try{
  setTimeout(function(){ throw Error() },100)
}
catch(error)
{
   console.log("YES",error);
}
它从未到达catch子句,并导致我的节点进程终止。同样的问题:

try{
  setTimeout(function(){undefinedMethod() },100)
}
catch(error)
{
   console.log("YES",error);
}
我的真实例子更接近于此:

 try{
   var ctx={setTimeout:setTimeout};
   require('vm').runInNewContext("setTimeout(function(){undefinedMethod() },100)",ctx)  
 }
 catch(error)
 {
   console.log(error);
 }

我需要试一试作为安全措施。当前,此行为导致我的节点进程终止。如何捕获异常?

这里有您问题的答案:


解决方案是将try catch移动到超时时调用的方法中。

如果错误是一致的,并且可以在vm上下文之外的代码中处理,则可以使用未处理异常和拒绝的全局处理程序来捕获这些错误

process.on('unhandledRejection', console.log);
process.on('uncaughtException',  console.log);

把try/catch放在超时时间内怎么样?在我的情况下我不能这样做。正是我所想的。我不确定在try/catch中的超时时间内在匿名函数中抛出错误是否有效。我理解这个问题。我只是无法终止node.js进程。为什么不能使用如下内容:require('vm').runInNewContext(“setTimeout(function(){try{undefinedMethod();}catch(error){console.log(error);}},100)”,ctx),因为如果有其他嵌入的闭包,这对您没有帮助。我想系上安全带作为最后的措施,但看起来不可能。