我目前正在使用node.js应用程序,并且遇到了通常的异步代码问题。
我正在Node的HTTP模块之上实现服务服务器。
该服务器支持(类似表达)路由。例如,我有如下代码:
server.any("/someRoute",function(req,resp){
resp.end("this text is sent to clients via http")
});
服务器需要能够承受故障,当传递给任何函数的问题出现时,我不想使整个服务器崩溃。当我编写如下代码时,会发生问题:
server.any("/someRoute",function(req,resp){
setTimeout(function(){
throw new Error("This won't get caught");
},100);
});
我看不到如何在这里捕获错误。我不想因一个服务器端故障而使服务器崩溃,而是要服务500个。
我能够提出的唯一解决方案实际上并没有表现力。我只想出使用process.on("uncaughtException",callback)
和使用节点0.8的类似代码的方法Domains
(这是部分补救措施,但是Domains当前有问题,并且由于我最终不得不为每个句柄创建一个域,所以它仍然不能很好地表达)。
我想要完成的是将throw
动作从功能绑定到作用域,理想的解决方案是将所有抛出的错误从功能绑定到特定的处理函数。
这可能吗?在这种情况下处理错误的最佳实践是什么?
我想强调一点,它应该能够在出现错误请求后继续处理请求,并针对每个请求重新启动服务器或为每个处理程序创建域并捕获未捕获的异常,这对我来说是个坏主意。另外-
我听说诺言可以帮助我(throw
诺言中的某些内容),在这种情况下诺言可以帮助我吗?
警告
:我不建议使用域的原始答案,以后将不建议使用域,编写原始答案很有趣,但我不再相信它太相关了。相反,我建议使用事件处理程序和具有更好错误处理的Promise,以下是使用Promise的示例。这里使用的承诺是Bluebird:
Promise.try(function(){
throw new Error("Something");
}).catch(function(err){
console.log(err.message); // logs "Something"
});
超时(请注意,我们必须返回Promise.delay):
Promise.try(function() {
return Promise.delay(1000).then(function(){
throw new Error("something");
});
}).catch(function(err){
console.log("caught "+err.message);
});
使用一般的NodeJS函数:
var fs = Promise.promisifyAll("fs"); // creates readFileAsync that returns promise
fs.readFileAsync("myfile.txt").then(function(content){
console.log(content.toString()); // logs the file's contents
// can throw here and it'll catch it
}).catch(function(err){
console.log(err); // log any error from the `then` or the readFile operation
});
这种方法既快速又安全,我建议在下面的答案上方使用它,因为它使用的域可能不会保留下来。
我最终使用了域,创建了以下文件mistake.js
,其中包含以下代码:
var domain=require("domain");
module.exports = function(func){
var dom = domain.create();
return { "catch" :function(errHandle){
var args = arguments;
dom.on("error",function(err){
return errHandle(err);
}).run(function(){
func.call(null, args);
});
return this;
};
};
这是一些示例用法:
var atry = require("./mistake.js");
atry(function() {
setTimeout(function(){
throw "something";
},1000);
}).catch(function(err){
console.log("caught "+err);
});
它也像正常捕获同步代码一样工作
atry(function() {
throw "something";
}).catch(function(err){
console.log("caught "+err);
});
我希望对解决方案有一些反馈
另外,显然在v
0.8中,当您在域中捕获异常时,它仍然冒泡到process.on("uncaughtException")
。我处理这在我process.on("uncaughtException")
与
if (typeof e !== "object" || !e["domain_thrown"]) {
但是,文档建议采取process.on("uncaughtException")
任何方式
问题内容: 什么是处理这种情况的最佳方法。我处于受控环境中,所以我不想崩溃。 从setTimeout内抛出时,我们将始终获得: 如果抛出发生在setTimeout之前,那么bluebirds catch将捕获它: 结果是: 很棒-但是如何在节点或浏览器中处理这种性质的恶意异步回调。 问题答案: 承诺不是域,它们不会捕获异步回调中的异常。你就是做不到。 然而诺言来捕捉从内抛出的异常/ / 构造函数的
问题内容: 什么是处理这种情况的最佳方法。我处于受控环境中,所以我不想崩溃。 从setTimeout内抛出时,我们将始终获得: 如果抛出发生在setTimeout之前,那么bluebirds catch将捕获它: 结果是: 很棒-但是如何在节点或浏览器中处理这种性质的恶意异步回调。 问题答案: 承诺不是域,它们不会捕获异步回调中的异常。你就是做不到。 然而诺言来捕捉从内抛出的异常/ / 构造函数的
主要内容:错误和异常的区别,JS 异常处理,JS try catch finally 语句,JS 抛出错误,JS 错误类型在编程中,有时代码并不会像我们预期的那样运行,会遇到各式各样的错误,例如代码中使用了错误的符号、调用未定义的方法、网络错误、读取不存在的文件、没有操作权限等。 根据类型的不同,JavaScript 编程中的错误大致可以分为以下三种类型: 语法错误:也称为解析错误,一般是因为代码存在某些语法错误引起的。当发生语法错误时,代码会停止运行; 运行时错误:也称为异常,发生在程序运行期
问题内容: 我想使用Node.js域来捕获异常。到目前为止,它正在运行,但是有一个地方我无法获得域来捕获异常。回调中的exception2是在domain.on(’error’)处理程序中捕获并处理的,但没有捕获exception1。奇怪的是,当抛出exception1时,它不会像我期望的那样关闭Node。这是我的示例应用程序: 为了使exception2执行,我注释掉了exception 1。
问题内容: 我对Node.js并不陌生,尽管我通常对JavaScript非常熟悉。我的问题是关于如何处理node.js中的错误的“最佳实践”。 通常,在对Web服务器,FastCGI服务器或各种语言的网页进行编程时,我在多线程环境中使用带有阻止处理程序的Exceptions。当有请求进入时,我通常会执行以下操作: 这样,我始终可以处理内部错误并向用户发送有效响应。 我知道使用node.js可以执行
我有一个Spring Boot服务,其中包含一些用于并行异步调用的代码,如下所示: CompletableFuture future1=accountManager。getResult(url1); CompletableFuture future2=accountManager。getResult(url2); 复杂的Future.allOf(未来1,未来2)。 字符串result1=futur