async/await 如何優美的處理異常?
本著一種學習的態度寫了此話題,如有不妥之處還請各位大牛多多指點.
Purpose: 此解決方案,可以避免業務程式碼中出現大量的try/catch, 眾所周知try/catch對效能方面有一定的影響,另一方面try/catch在Node.js >= v8.3.0以後對效能的損耗是可以忽略不計的.
1. try/catch方法處理異常
async updateArticleById(ctx, next){ let id = ctx.params["id"]; let body = ctx.request.body; try { let ret = await Services.admin.updateArticle(id, body); ctx.body = {ret: 0, data: ret}; } catch(e) { ctx.body = {ret: 1, data: null, err: e.message || e.stack}; } }
- 以上捕獲異常是使用try/catch的方式來處理,因為await後面跟著的是Promise物件,當有異常的情況下會被Promise物件的內部
- catch捕獲,而await就是一個then的語法糖,並不會捕獲異常, 那就需要使用try/catch來捕獲異常,並進行相應的邏輯處理。
2. 封裝異常處理函式
- 知道了上面異常會被Promise物件自身的catch捕獲異常,可以使用下面的解決方案 to.js
module.exports = (promise) => { if(!promise || !Promise.prototype.isPrototypeOf(promise)){ return new Promise((resolve, reject)=>{ reject(new Error("requires promises as the param")); }).catch((err)=>{ return [err, null]; }); } return promise.then(function(){ return [null, ...arguments]; }).catch(err => { return [err, null]; }); };
格式[error, …result]
- 採用類似Golang風格的錯誤返回方式, 這裡指定第一個引數為錯誤引數,後面為正常返回結果
- if塊是用來處理非法引數,並返回錯誤[err, null]
- await後面如果是一個promise物件,那麼await的任務就是在等待promise.resolve,而to.js就是主動去呼叫then和catch,主動處理並重新封裝結果,並且在then或是catch裡面繼續返回封裝後的資料,返回值對於await來說仍然是一個promise物件,然而resolve的值卻是一個可迭代的物件[error, …result]
這個可迭代的物件如何使用 ?
async updateArticleById(ctx, next){ let body = ctx.request.body; let id = ctx.request.params["id"]; let [err, ret] = await ctx.app.utils.to(Services.admin.updateArticleById(id, body)); if(err) { return ctx.body = {ret: 1, data: null, err: err}; } ctx.body = {ret: 0, data: ret}; }
相關文章
- Callback Promise Generator Async-Await 和異常處理的演進PromiseAI
- 如何優雅處理前端異常?前端
- 如何優雅的處理異常
- async/await 優雅的錯誤處理方法AI
- 如何優雅地處理前端異常?前端
- [譯]Go如何優雅的處理異常Go
- JSP 異常處理如何處理?JS
- 教你如何優雅處理Golang中的異常Golang
- 前端多執行緒處理——async/await前端執行緒AI
- 異常篇——異常處理
- 異常處理
- 你真的會在async/await中捕獲異常嗎?AI
- 何時需要對 async/await 進行異常捕獲AI
- 異常-throws的方式處理異常
- 異常處理與異常函式函式
- 如何使用SpringMvc處理Rest異常SpringMVCREST
- 請問EJB容器如何處理異常
- JavaScript 異常處理JavaScript
- ThinkPHP 異常處理PHP
- React 異常處理React
- 08、異常處理
- JAVA 異常處理Java
- JAVA異常處理Java
- Abp 異常處理
- oracle異常處理Oracle
- PowerShell 異常處理
- plsql異常處理SQL
- Swift 異常處理Swift
- JS異常處理JS
- app異常處理APP
- Oracle 處理異常Oracle
- MySQL異常處理MySql
- 異常處理 (轉)
- golang - 異常處理Golang
- 異常處理2
- 異常處理1
- 異常的處理
- Java 異常處理Java