adn*_*ili 8 javascript node.js async-await ecmascript-next
他们已经对这个话题提出了疑问
这是旧的,答案已经过时,domains甚至已经被弃用了.
现在在Async/Await Node.js之后的场景中,我们不应该同样考虑同步和异步情况,并在同步函数中抛出异常并拒绝异步函数中的promise,而不是Error在前一种情况下返回实例.
let divideSync = function(x,y) {
// if error condition?
if ( y === 0 ) {
// "throw" the error
throw new Error("Can't divide by zero exception")
}
else {
// no error occured, continue on
return x/y
}
}
Run Code Online (Sandbox Code Playgroud)
模拟异步除法运算
let divideAsync = function(x, y) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
// if error condition?
if (y === 0) {
// "throw" the error safely by rejecting the promise
reject (new Error("Can't divide by zero exception"));
} else {
// no error occured, continue on
resolve(x / y)
}
}, 1000);
})
};
Run Code Online (Sandbox Code Playgroud)
因此,可以以统一的方式处理同步和异步异常
let main = async function () {
try {
//const resultSync = divideSync(4,0);
const resultAsync = await divideAsync(4,0);
}
catch(ex) {
console.log(ex.message);
}
}
Run Code Online (Sandbox Code Playgroud)
Ber*_*rgi 10
Node.js最佳实践异常处理的答案很老,而且已经过时了
没有那么多.这个维护良好的博客文章列表中的答案是最新的.
官方node.js指南始终是一个很好的阅读,一般的方法并没有改变那么多.
那变了什么?
async/ 取代await.(注意:事件发射器等是不同的情况)process.on('uncaughtException') 补充 process.on('unhandledRejection')那么这对于公共代码意味着什么呢?
我们不应该同样考虑同步和异步情况并在同步函数中抛出异常并拒绝异步函数中的promise而不是返回
Error实例吗?
对,就是这样.你应该用Errors(或者throw来自async functions)拒绝你的承诺.
请注意,您很少会打电话给reject自己.有了承诺,您应该能够使用throw您的代码.如果你不能,你可能没有正确使用它们 - 程序员的错误也不会被抓住.
此代码的黄金法则是:永远不要使用非承诺回调的回调."无极回调"是指new Promise,then和catch论据,并可能你的一些库(例如自定义的方法finally).这是您上面的示例代码有问题的地方.写得正确,它应该读
async function divideAsync(x, y) {
await new Promise(resolve =>
setTimeout(resolve, 1000) // don't even pass a function expression
);
if (y === 0) {
throw new Error("Can't divide by zero exception");
} else {
return x / y;
}
}
Run Code Online (Sandbox Code Playgroud)