Javascript中是否存在不可修补的异常?

Javascript中是否存在不可修补的异常?,javascript,exception,exception-handling,Javascript,Exception,Exception Handling,是否有javascript运行时(浏览器、节点等)抛出过不可跟踪的异常?javascript环境中遇到的任何和所有异常都可以在try/catch语句中捕获吗?如果异常是指破坏脚本的任何异常情况,那么所有异常都可以抛出不可捕获的异常,因为大多数语法错误都不可捕获。只能捕获动态计算代码(eval,new Function)中的语法错误 try { :( } catch(e) { } // uncatchable syntax error 假设您的意思是使用try..catch可捕获。从技术上讲,您

是否有javascript运行时(浏览器、节点等)抛出过不可跟踪的异常?javascript环境中遇到的任何和所有异常都可以在try/catch语句中捕获吗?

如果异常是指破坏脚本的任何异常情况,那么所有异常都可以抛出不可捕获的异常,因为大多数语法错误都不可捕获。只能捕获动态计算代码(
eval
new Function
)中的语法错误

try { :( } catch(e) { } // uncatchable syntax error
假设您的意思是使用
try..catch
可捕获。从技术上讲,您可以使用
error
事件捕获来自其他脚本块的语法错误:

<script> onerror = function (e) { return true; }; </script>
<script> :( </script>
onerror=函数(e){return true;};
:( 


另一方面,也许您不认为在评估之前发生的错误是例外。在这种情况下,“不可捕获的异常”可能被降级为从其他执行上下文中抛出的异常(如用StimeToEt调用的函数)。,您无法控制引发异常的执行上下文。当然,这些异常不会中断程序的流程。

概括另一个答案-如果没有“bug枪”,异步异常通常是不可能处理的专门设计用于处理它们-即域和进程
节点中的“uncaughtException”
事件和浏览器中的
onerror

获取此类错误的最简单方法是:

setTimeout(function(){
    throw "Catch me if you can!";
});

这是您在http.get({host:host,port:80},console.error)中看到的;在另一个答案的示例中。

告诉我们您尝试了什么,以及为什么它不能满足您的需要。这表明您花了时间尝试帮助自己,它避免了我们重复显而易见的答案,最重要的是它帮助您获得更具体和相关的答案。还可以查看异步回调的异常很难(但并非不可能)捕获。基本上这取决于提供异步功能的环境。这个问题是否属于programmers.se?存在不可捕获的静默安全错误,因为捕获它们会泄露有关系统硬件的信息。很难说这些错误是否真的是Javascript错误。很好回答。我只想指出,在ECMAScript 5规范中,不可修补错误的类别被称为“”。早期错误是语法错误的超集(因为它们还包括一些与语法无关的非法声明)@apsillers的观点很好。IIRC中列出的所有内容都归结为Chrome和Moz中的SyntaxError,除了PutValue是引用错误。但这些都不是真正的例外,是吗?@JuanMendes问得好。规范从未定义“异常”,但在使用类似“抛出SyntaxError异常”的语言时,它似乎相当一致在处理评估期间发生的事情时,以及在处理评估之前发生的事情时使用“is a SyntaxError”之类的语言。如果在评估之前发生,则将其视为不例外是有道理的,但我不确定OP的想法。@Hey:您想读一下:-)的最后一段吗我认为http.get中的异常还有更多的地方。我可以用onerror捕捉setTimeout抛出的异常,但不能捕捉http.get抛出的异常(虽然它是以异步方式抛出的,但在调用http.get之后处理仍在继续)。@嘿,这是因为
onerror
是一个浏览器工具,节点等效物将使用
process.on(“uncaughtException”),函数(e){…
Oops,我是说node的uncaughtException。不过,我刚刚意识到node没有捕获任何带有uncaughtException的内容。可能该功能被取消了?我想,在单独的执行上下文中抛出的错误是可捕获的还是不可捕获的,这取决于您是否愿意修改其他人的代码(或者使用类似onerror/uncaughtException的废话)显示您的代码-uncaughtException在节点中工作正常。
process.on(“uncaughtException”,函数(e){console.log('hi')});抛出'woo'