警告
:我不建议使用域的原始答案,以后将不建议使用域,编写原始答案很有趣,但我不再相信它太相关了。相反,我建议使用事件处理程序和具有更好错误处理的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 promisefs.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")任何方式
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)