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 Promisethencatch你的图书馆的论点,甚至可能还有一些自定义的方法(例如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; } }