根据我的经验,php服务器会向日志或服务器端抛出异常,但是node.js只会崩溃。因为尝试都是异步完成的,所以用try-
catch包围我的代码也不起作用。我想知道其他人在生产服务器中做什么。
您可以从Node自己的文档中(http://nodejs.org/docs/latest/api/process.html#process_event_uncaughtexception)阅读其他答案,真是太疯狂了
如果有人在使用其他规定的答案,请阅读Node Docs:
请注意,这
uncaughtException
是异常处理的非常粗糙的机制,以后可能会删除
下午2
首先,我会强烈建议安装PM2
的Node.js
。PM2非常适合处理崩溃和监视Node应用程序以及负载平衡。每当PM2崩溃时,PM2都会立即启动Node应用程序,无论出于任何原因甚至在服务器重新启动时都会停止。因此,即使有一天即使在管理完我们的代码之后,应用程序崩溃,PM2仍可以立即重新启动它。有关更多信息,请安装并运行PM2
现在回到我们的解决方案,以防止应用程序本身崩溃。
因此,经过研究之后,我终于想到了Node文档本身的建议:
不要使用
uncaughtException
,而是使用domains
with
cluster
。如果您使用uncaughtException
,请在每个未处理的异常后重新启动应用程序!
*含 *丛集的 DOMAIN* *
我们实际上要做的是向触发错误的请求发送错误响应,同时让其他请求在正常时间内完成,并停止侦听该工作线程中的新请求。
这样,域使用与群集模块紧密结合,因为当工作进程遇到错误时,主进程可以派生新的工作进程。请参阅下面的代码以了解我的意思
通过使用Domain
,以及使用Cluster
可以将程序分为多个工作进程的弹性,我们可以做出更适当的反应,并以更高的安全性处理错误。
var cluster = require('cluster');
var PORT = +process.env.PORT || 1337;
if(cluster.isMaster)
{
cluster.fork();
cluster.fork();
cluster.on('disconnect', function(worker)
{
console.error('disconnect!');
cluster.fork();
});
}
else
{
var domain = require('domain');
var server = require('http').createServer(function(req, res)
{
var d = domain.create();
d.on('error', function(er)
{
//something unexpected occurred
console.error('error', er.stack);
try
{
//make sure we close down within 30 seconds
var killtimer = setTimeout(function()
{
process.exit(1);
}, 30000);
// But don't keep the process open just for that!
killtimer.unref();
//stop taking new requests.
server.close();
//Let the master know we're dead. This will trigger a
//'disconnect' in the cluster master, and then it will fork
//a new worker.
cluster.worker.disconnect();
//send an error to the request that triggered the problem
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!\n');
}
catch (er2)
{
//oh well, not much we can do at this point.
console.error('Error sending 500!', er2.stack);
}
});
//Because req and res were created before this domain existed,
//we need to explicitly add them.
d.add(req);
d.add(res);
//Now run the handler function in the domain.
d.run(function()
{
//You'd put your fancy application logic here.
handleRequest(req, res);
});
});
server.listen(PORT);
}
尽管Domain
正在等待弃用,但随着新的替换如Node文档中所述,将被删除
该模块即将弃用。替代API最终确定后,该模块将被完全弃用。绝对必须具有域提供的功能的用户暂时可能会依赖它,但是应该期望将来必须迁移到其他解决方案。
但是直到没有引入新的替代方案之前,“带群集的域”是Node Documentation建议的唯一好的解决方案。
供深入了解Domain
和Cluster
阅读
~~https://nodejs.org/api/domain.html#domain_domain~~
(Stability: 0 - Deprecated
)
https://nodejs.org/api/cluster.html
感谢@Stanley Luo向我们分享了有关集群和域的精彩深入解释
集群与域
在 中,尝试捕获最终阻止的工作原理是什么? 所以如果有例外,我知道它会跳到捕获块,然后跳到最后的块。 但是如果没有错误,catch块不会运行,但是finally块会运行吗?
我有一个PowerShell脚本,它从文件中获取文件名列表,在文件夹中搜索文件名,将其存档,然后执行其他操作。 try-catch没有像预期的那样工作。文件列表中有一个文件名不在$some_path中。我期望try-catch停止执行并执行写主机。相反,它不运行写主机,而是继续执行< code > $ data = Get-Content $ current _ file 步骤,这将抛出一个终止错
我在试着写一个小数
我有一个discord bot,我正在处理一个命令,该命令从mysql数据库中显示关于一个字符的信息(通过提供字符名)。它工作得很好,但如果我提供了一个数据库中不存在的名称,如,则bot会崩溃。所以我的问题是。希望你能理解我的意思。 代码如下: 如果你需要我提供你更多的信息,让我知道。 感谢任何帮助!
我已经写了一个节点。使用express框架的jsapi。我正在使用wait和async。我在try-catch块中捕获异步函数。但是,在catch(err)方法中,不会返回err。 在上面的例子中,我故意调用一个不存在的函数,这样它就会抛出一个错误。 我得到的答复如下。它正在命中catch块,但没有将错误添加到数据对象中。 但是,如果我将下面的行移出try catch块。控制台将抛出以下错误。 所