js中处理 await 异步异常以及try、catch、finally、throw 的基本使用

我们在项目中经常遇到报错程序终止执行,无法看到后续代码渲染的内容,尤其是编写异步代码时无法捕捉错误,更是头疼。
下面是一个简单的错误处理的小例子。帮助大家提供一个简单思路。

async getListData(version2Ids) {
      let version1Id = getStore({ name: "versionId" });
      let projectId = getStore({ name: "proId" });
      let versionType = getStore({ name: "versionType" });
      let data3 = {
        version1Id: version1Id,
        version2Id: version2Ids || version2Id,
        projectId
      };
      try {
        await benchmarkingHeader(data3).then(res => {
          if (res.data.msg == "success") {
            
            }
            return res.data.data;
          } else {
          }
        });
        //如果没有找到任何异常处理程序,js将会把异常当成程序错误来处理,并在浏览器显示;
        throw new Error("接口异常了,赶紧看看啊!!!");
      } catch (e) {
        console.log(e);//将异常拦截并显示
      }
      finally{
        console.log('不管try是否抛出异常,这里的逻辑总会执行')
      }

### try...catch...finally 的不同组合及其使用方法 #### 组合一:仅使用 `try` 和 `catch` 当只需要捕获并处理异常时,可以省略 `finally` 块。这种情况下,只有在 `try` 块中发生异常时才会进入 `catch`。 ```javascript try { const result = someFunctionThatMightThrow(); // 可能抛出异常的操作 console.log(result); } catch (error) { console.error('An error occurred:', error.message); // 处理异常 } ``` 这种方式适用于不需要清理资源或其他收尾工作的场景[^1]。 --- #### 组合二:仅使用 `try` 和 `finally` 如果需要确保某些代码无论如何都执行(即使没有异常),而无需单独处理异常,则可以省略 `catch` 块。 ```javascript try { const result = performOperation(); console.log(result); } finally { cleanupResources(); // 清理资源或完成其他必要的操作 } ``` 此模式常用于释放锁、关闭文件流等操作[^2]。 --- #### 组合三:完整的 `try...catch...finally` 这是最全面的形式,既能够捕获和处理异常,又可以在任何情况下运行特定的逻辑。 ```javascript try { const response = await fetch('https://api.example.com/data'); if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } const data = await response.json(); console.log(data); } catch (error) { console.error('Error fetching data:', error.message); // 捕获并记录错误 } finally { hideLoadingIndicator(); // 隐藏加载指示器 } ``` 上述例子展示了如何结合异步请求、错误处理以及最终状态管理的功能[^3]。 --- #### 特殊情况:重新抛出异常 有时可能希望捕获异常后对其进行初步处理,然后再将其传递给更高级别的上下文中去进一步解决。 ```javascript try { riskyAction(); } catch (error) { logErrorToServer(error); // 将错误日志发送至服务器 throw error; // 重新抛出以便更高层继续处理 } finally { finalizeProcess(); // 执行最后一步骤 } ``` 通过这样的设计可以让多个层次共同参与同一个问题的不同方面解决方案。 --- ### 注意事项 - 如果存在 `return` 或 `throw` 语句,在 `finally` 中仍然会被延迟执行直至其内部代码完全结束。 - 当前 JavaScript 实现下,即便有未被捕获的异常也会先走完 `finally` 路径再终止程序流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值