为什么Javascript异常会使解释器处于不可预测的状态?

为什么Javascript异常会使解释器处于不可预测的状态?,javascript,node.js,v8,Javascript,Node.js,V8,异常会导致Node.js服务器崩溃。一般的看法是,需要监视Node.js进程,并在崩溃时重新启动它们。为什么不能将整个脚本包装在try{}catch{}中或侦听异常事件 可以理解,捕获所有异常是不好的,因为它使解释器处于不可预测的状态。这是真的吗?为什么?这是V8特有的问题吗?异常是事件引擎的一部分。您要做的不是尝试,而是倾听该异常 然后以适当的方式回应 关于你问题的第二部分: 这取决于你的应用。您需要进行测试,以查看异常是否超出您的预期。有时异常是真实的,而不仅仅是找不到文件 捕获所有异常不会

异常会导致Node.js服务器崩溃。一般的看法是,需要监视Node.js进程,并在崩溃时重新启动它们。为什么不能将整个脚本包装在
try{}catch{}
中或侦听异常事件


可以理解,捕获所有异常是不好的,因为它使解释器处于不可预测的状态。这是真的吗?为什么?这是V8特有的问题吗?

异常是事件引擎的一部分。您要做的不是尝试,而是倾听该异常

然后以适当的方式回应

关于你问题的第二部分:


这取决于你的应用。您需要进行测试,以查看异常是否超出您的预期。有时异常是真实的,而不仅仅是找不到文件

捕获所有异常不会使解释器处于错误状态,但可能会使应用程序处于错误状态。一个未捕获的异常意味着您期望工作的东西失败了,并且您的应用程序不知道如何处理该故障

例如,如果您的应用程序是侦听端口80进行连接的web服务器,并且当应用程序启动时,该端口正在使用中,则会引发异常。您的代码可能会忽略它,然后进程可能会继续运行而不实际侦听端口,因此该进程将无效,或者处理它:打印错误消息、警告、终止另一个进程,或者以您希望的任何方式处理它。但是你可以明白为什么忽视它不是一个好主意


另一个例子是无法与数据库通信(断开连接、无法连接、接收到意外错误)。如果应用程序流没有正确捕获异常,只是忽略了异常,则可能是向用户发送了一个失败事件的确认。

由于回调,包装整个脚本将无法工作。例如,
try{setTimeout(function(){throw new Error;},100);}catch(E){}
仍然会引发错误,因为
try catch
只考虑实际的
setTimeout
调用,而不考虑回调中发生的事情。@pimvdb啊,说得好。Node.js大量使用setTimeout,因此这可能是普通Node.js应用程序中的一个重要问题,对吗?据我所知,
setTimeout
在Node中并不常见,但当然大多数IO函数都接受回调。但是它们都会传递错误(作为第一个回调参数,或者使用
.on(“error”
用于
EventEmitter
s),所以您应该能够捕获大多数错误。使用事件捕获异常只是一个实现细节,但我已根据您的建议编辑了我的答案。我不确定这是否是我的核心问题的答案。从根本上说,异常是异常的,不能期望对所有可能的场景进行彻底测试。我正在寻求理解Javascript中异常处理的基本原理。我不认为它们与任何其他系统中的异常处理不同。捕获灾难性异常是一个很好的时间来记录它,提醒您并在可能的情况下重新启动它。我确实认为您不能全部测试它们,但可能会有您期待的异常。这是真的,我只是假设he正在谈论应用程序。没有听清解释器部分。