当前位置: 首页 > news >正文

await func().catch()和try{ func() }.catch(),两种写法,有什么区别

await func().catch() 和 try { await func() } catch {} 是两种处理异步操作错误的常见写法,虽然它们的功能相似,但在使用场景和细节上有一些区别。

1. await func().catch()

这种写法是将 catch 直接链式调用到 func() 上,捕获 func() 返回的 Promise 的错误。

await func().catch(error => {
  console.error('Error:', error);
});

特点:

  • 简洁:代码更简洁,适合简单的错误处理。
  • 作用范围:只捕获 func() 的 Promise 错误,不会捕获 catch 回调中的错误。
  • 返回值:如果 func() 成功,返回 func() 的结果;如果失败,返回 catch 回调的返回值(如果没有返回值,则是 undefined)。

适用场景:

  • 当你只需要简单地处理错误,并且不需要在 catch 中执行复杂逻辑时。
  • 当你希望将错误处理和业务逻辑分开时。

2. try { await func() } catch {}

这种写法是传统的 try-catch 语法,用于捕获 await func() 中的错误。

try {
  const result = await func();
  console.log('Success:', result);
} catch (error) {
  console.error('Error:', error);
}

特点:

  • 明确:错误处理逻辑更清晰,适合复杂的错误处理。
  • 作用范围:可以捕获 try 块中所有同步和异步的错误(包括 await func()try 块中的其他代码)。
  • 返回值:如果 func() 成功,返回 func() 的结果;如果失败,进入 catch 块。

适用场景:

  • 当你需要在错误处理中执行复杂逻辑时。
  • 当你需要捕获 try 块中所有可能的错误时。

3. 两种写法的区别

特性await func().catch()try { await func() } catch {}
代码简洁性更简洁稍显冗长
错误捕获范围

只捕获 func() 的 Promise 错误

捕获 try 块中所有同步和异步错误
返回值处理返回 func() 或 catch 回调的结果返回 func() 或进入 catch 块
适用场景简单错误处理复杂错误处理
可读性适合链式调用,但错误处理逻辑可能不够直观错误处理逻辑更清晰

4. 示例对比

(1)await func().catch()

const result = await func().catch(error => {
  console.error('Error:', error);
  return 'default value'; // 返回一个默认值
});
console.log('Result:', result); // 如果 func() 失败,输出 'default value'

(2)try { await func() } catch {}

let result;
try {
  result = await func();
  console.log('Success:', result);
} catch (error) {
  console.error('Error:', error);
  result = 'default value'; // 返回一个默认值
}
console.log('Result:', result); // 如果 func() 失败,输出 'default value'

5. 如何选择?

  • 如果你只需要简单地处理错误,并且希望代码更简洁,可以使用 await func().catch()
  • 如果你需要处理复杂的错误逻辑,或者需要捕获 try 块中的所有错误,建议使用 try { await func() } catch {}

6. 总结

  • await func().catch():简洁,适合简单错误处理,只捕获 func() 的错误。
  • try { await func() } catch {}:功能更强大,适合复杂错误处理,捕获 try 块中所有错误。

参考:https://juejin.cn/post/7483870074287439911

相关文章:

  • 设计模式之工厂模式的优缺点
  • NLP 与常见的nlp应用
  • AI在工业自动化中的应用与挑战
  • 麦科信新品发布,8MHz,300Arms高频交直流电流探头CP3008
  • Linux驱动开发实战之SRIO驱动(二)基于Tsi721驱动
  • 分布式中间件:RabbitMQ确认消费机制
  • QT网页显示的几种方法及对比
  • 计算机网络精讲day1——计算机网络的性能指标(上)
  • 【大坐标处理】
  • MyBatis plus详解
  • 使用BootStrap 3的原创的模态框组件,没法弹出!估计是原创的bug
  • day-110 下降路径最小和 II
  • filebeat和logstash区别
  • reCAPTCHA 打码平台
  • CCBCISCN复盘
  • Ubuntu检查并启用 Nginx 的stream模块或重新安装支持stream模块的Nginx
  • MacOS下的IntelliJ IDEA突然无法访问本机的虚拟机
  • Ubuntu上查看GPU使用情况并释放内存
  • 【C++】C++类
  • Java集合操作三剑客:Collection、collect与Collectors的协奏曲
  • 绍兴柯桥:用一块布托起中国制造的新经纬
  • 西安碑林博物馆票价将调至85元,工作人员:10元属于改扩建期间惠民票
  • 短剧剧组在贵州拍戏突遇极端天气,演员背部、手臂被冰雹砸伤
  • 老人刷老年卡乘车被要求站着?公交公司致歉:涉事司机停职
  • 洗衣机无法有效杀菌
  • 新闻1+1丨多地政府食堂开放 “舌尖上的服务”,反映出怎样的理念转变?