他们已经对这个话题提出了疑问
Node.js Best Practice Exception Handling
这是旧的,答案已经过时了, 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
}
}
模拟异步除法运算
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);
})
};
因此,可以以统一的方式处理同步和异步异常
let main = async function () {
try {
//const resultSync = divideSync(4,0);
const resultAsync = await divideAsync(4,0);
}
catch(ex) {
console.log(ex.message);
}
}
1 回答
没有那么多 . This answer,包含this well-maintained blog post的列表,是最新的 .
The offical node.js guide总是很好读,而且一般方法没有那么大改变 .
那变了什么?
域被破坏和弃用 . 嗯,这是个老消息 .
不应再使用典型的"node-style callbacks"及其error-first-parameter,它们只被触发一次 . 这种简单的顺序异步编码风格及其所有问题已被promise和
async
/await
取代 . (注意:事件 Launcher 等是不同的情况)process.on('uncaughtException')
由process.on('unhandledRejection')补充如果使用正确,
promise也会捕获程序员错误 . 对于无聊的顺序异步代码,它们可以替换域 .
那么这对于公共代码意味着什么呢?
对,就是这样 . 你应该用
Error
(或async function
来自async function
)拒绝你的承诺 .请注意,您很少需要自己调用
reject
. 有了承诺,您应该能够在代码中使用throw
. 如果你可能't, you'可能没有正确使用它们 - 程序员的错误也不会被 grab .此代码的黄金法则是: Never use callbacks 不是承诺回调 . "Promise callbacks"指的是
new Promise
,then
和catch
参数,可能还有一些库的自定义方法(例如finally
) . 这是您上面的示例代码有问题的地方 . 写得正确,它应该读