请教 js 中如何优雅的处理异步异常?

2020 年 1 月 20 日
 rioshikelong121

 setTimeout(() => {
    throw new Error("Whoops!");
  }, 1000);

比如上述场景, 外层的 try-catch 等方式肯定是无法处理的,不考虑 window.onerror.

除了使用使用 Promise.reject 改写上述代码为


 new Promise((resolve, reject) => {
   setTimeout(() => {
    reject("Whoops!");
  }, 1000);
 }).catch(/* errorHandle */)

或者在 setTimout 内部 try-catch 以外,还有什么方案么?

4021 次点击
所在节点    JavaScript
17 条回复
H15018327040
2020 年 1 月 20 日
async/await?
maichael
2020 年 1 月 20 日
setTimeout(() => {
try {
throw new Error("Whoops!");
} catch {
// handle error
}
}, 1000);

这样?
Vegetable
2020 年 1 月 20 日
async/await+trycatch
Vegetable
2020 年 1 月 20 日
哦还有 promiss
Vegetable
2020 年 1 月 20 日
e..
fool079
2020 年 1 月 20 日
async + try catch
zhw2590582
2020 年 1 月 20 日
还有个不优雅写法
window.addEventListener('unhandledrejection', function(err) {});
rioshikelong121
2020 年 1 月 20 日
@zhw2590582 根据我的理解, 这个写法还得用 Promise 包装一下, 普通的 setTimeout 内抛出的异常是触发不了的。浏览器环境得用 onerror, node 环境得用 process.on('uncaughtException')
rioshikelong121
2020 年 1 月 20 日
@Vegetable 恩 貌似引入 async/await 是个方法。
zaul
2020 年 1 月 20 日
promise 深入了解下
rioshikelong121
2020 年 1 月 20 日
这么多人不看描述的 :)
SorcererXW
2020 年 1 月 20 日
async function sleep(timeout){
return new Promise(resolve=>setTImeout(timeout, resolve))
}

new Promise((resolve,reject)=>{
await sleep(1000)
try{
throw new Error(xxxx)
}catch(e){
reject(e)
}
})
.then()
.catch()
SorcererXW
2020 年 1 月 20 日
在一个 promise 里面直接同步等完这 1 秒,再让 reject 处理掉抛出的 error
liuzhaowei55
2020 年 1 月 20 日
如果不是异常→返回这种开发模式,就尽量把逻辑完善了,测试做到位,剩下的异常异常不优雅也无所谓
autoxbc
2020 年 1 月 20 日
js 的异常捕获包括 try catch 和 promise.catch 都是纯正的同步异常捕获,js 里没有真正意义上的异步异常捕获

我猜语言设计者想保证流程控制的简单性和可预测性,换句话说,在异步流程的同步部分捕获异常更优雅
redbuck
2020 年 1 月 20 日
好玩一点的玩法可以写个 babel 插件,自动插入错误处理逻辑
KuroNekoFan
2020 年 1 月 21 日
就用 promise catch 吧
我始终认为 promise 比 async/await 的语法在控制粒度上更细

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/639474

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX