簡體   English   中英

Node.js最佳實踐異常處理 - 異步/等待后

[英]Node.js Best Practice Exception Handling - After Async/Await

他們已經對這個話題提出了疑問

Node.js最佳實踐異常處理

這是舊的,答案非常過時,從那時起, 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);
    }

}

Node.js最佳實踐異常處理的答案很老,而且已經過時了

沒有那么多。 這個 維護良好的博客文章列表中的答案是最新的。
官方node.js指南始終是一個很好的閱讀,一般的方法並沒有改變那么多。

那變了什么?

  • 域被破壞和棄用。 嗯,這是個老消息。
  • 不應再使用具有error-first-parameter的典型“節點式回調”,它們只被觸發一次。 這種簡單的順序異步編碼風格及其所有問題已被promise和async / await所取代。 注意:事件發射器等是不同的情況
  • process.on('uncaughtException')process.on('unhandledRejection')補充
  • 如果使用正確, promises也會捕獲程序員錯誤。 對於無聊的順序異步代碼,它們可以替換域。

那么這對於公共代碼意味着什么呢?

我們不應該同樣考慮同步和異步情況並在同步函數中拋出異常並拒絕異步函數中的promise而不是返回Error實例嗎?

對,就是這樣。 您應該使用Error s拒絕您的承諾(或者從async function throw它們)。

請注意,您很少會自己打電話reject 有了承諾,你應該能夠throw你的代碼。 如果你不能,你可能沒有正確使用它們 - 程序員的錯誤也不會被抓住。

此代碼的黃金法則是: 永遠不要使用非承諾回調的回調。 “Promise回調”指的是new Promisethen 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM