Node.js最佳实践exception处理 – asynchronous/等待之后
他们已经是这个话题的一个问题了
Node.js最佳实践exception处理
这是旧的,答案是非常过时的,从那时起, domains
甚至被弃用。
现在,在asynchronous/等待Node.js的情况下,我们不应该同时考虑同步和asynchronous情况,并在asynchronous函数中抛出exception,并在asynchronous函数中拒绝承诺,而不是在前一种情况下返回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 } }
模拟asynchronous分割操作
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); }) };
所以同步和asynchronousexception可以统一处理
let main = async function () { try { //const resultSync = divideSync(4,0); const resultAsync = await divideAsync(4,0); } catch(ex) { console.log(ex.message); } }
Node.js最佳实践exception处理的答案很旧,而且非常落后
没有那么多。 这个答案 ,从这个维护良好的博客文章的名单,是相当新的。
官方的node.js指南总是很好的阅读,一般的方法并没有太大的改变。
那么改变了什么?
- 域名已被破坏并被弃用。 那么,这是旧消息。
- 应该不再使用典型的“节点式callback”,它们的错误优先参数只能触发一次。 这个简单的顺序asynchronous编码风格已经被promise和
async
/await
所取代。 ( 注:事件发射器等是不同的情况 ) -
process.on('uncaughtException')
由process.on('unhandledRejection')
补充 - 如果使用正确的话, promise也会捕获程序错误。 对于无聊的顺序asynchronous代码,他们可以取代域名。
那么这对通用代码意味着什么呢?
我们不应该同时考虑同步和asynchronous情况,并在同步函数中抛出exception,并在asynchronous函数中拒绝承诺,而不是返回一个
Error
实例?
对,就是这样。 你应该拒绝你的承诺与Error
(或throw
他们从async function
)。
注意你很less必须自己打电话reject
。 有了承诺,你应该能够throw
你的代码。 如果你不能,你很可能没有正确地使用它们,程序员的错误也不会被捕获。
此代码的黄金法则是: 永远不要使用不是承诺callback的callback。 “Promisecallback”指的是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; } }