簡體   English   中英

如何在不重新引發錯誤或不使用Promise.reject的情況下捕獲來自異步函數的錯誤?

[英]How to ensure an error from an async function is captured without rethrowing the error or using Promise.reject?

請看下面的代碼。 第5行: return ex

當我調用myFunc ,我希望在控制台中看到'err' ,但是我看到'yes' ,這意味着在myFunc之外未捕獲該錯誤。 該錯誤沒有冒泡。

這是有道理的,因為我沒有拋出錯誤: throw ex或使用Promise.reject(ex)

我的問題是:如何確保不使用上述兩種方法就將錯誤捕獲到我的函數之外? 有辦法嗎?

async function myFunc() {
    try {
        throw new Error();
    } catch (ex) {
        return ex;
    }
}

myFunc().then(() => console.log('yes')).catch(() => console.log('err'))
// 'yes'

最好的方法是這樣做:

async function myFunc() {
    try {
        throw new Error();
    } catch (ex) {
        throw ex;
    }
}

我試圖回答這個問題,但最終重寫了我的整個答案。 有一次,我刪除了答案。

正如您在問題中已經說過的那樣, throw exPromise.reject(ex)是唯一的方法。

當我在應用程序中使用async function時,通常將其作為從Promise鏈接遷移並刪除then catch 混合使用async functionthenPromise調用它, then catch語法,這確實很奇怪。

實際上,我認為按如下所示進行混合是很危險的: JavaScript Promises-拒絕與拋出

如果您沉迷於我,我想使用async function重寫您的呼叫者並await

 async function myFunc() { throw new Error("Some Error!"); } ( async function () { try { await myFunc(); console.log("yes"); } catch (err) { console.log("err: ", err.message); } } )(); 

此語法類似於它的同步對應項,后者推斷我們應該使用throw

 function myFunc() { throw new Error("Some Error!"); } ( function () { try { myFunc(); console.log("yes"); } catch (err) { console.log("err: ", err.message); } } )(); 

使用異步功能時,您可以使用普通的javascript try / catch處理錯誤。

如果在異步函數中拋出,則它返回的promise將被拒絕。 如果您從異步函數返回(如您在catch塊中所做的那樣),則將使用返回的值(在您的情況下為例外)來解析promise

這是兩個示例,說明如何處理可能引發的異步函數:

 // async function that might throw async function funcThatThrows() { throw new Error("IT THROWS!"); } // Exception Handling in other async functions async function example1() { try { let result = await funcThatThrows(); /* ... */ } catch(e) { console.log("example1:", e.message); } } // Exception handling in non-async functions function example2() { funcThatThrows() .then(result => { /* ... */ }) .catch(err => console.log("example2:", err.message)); } example1(); example2(); 

有關異步錯誤處理的詳細教程,請參見Javascript異步/等待錯誤處理:)

暫無
暫無

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

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