当前位置:首页 > javascript > 正文内容

Javascript try catch的使用

hxing6417个月前 (01-13)javascript3819

说到 try...catch 都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上:try...catch 只能捕捉到同步执行代码块中的错误。 题目是:以下代码有错吗?如果有错,应该如何改正?

try {
  setTimeout(() => {
    throw new Error('err')
  }, 200);
} catch (err) {
  console.log(err);
}
 
try {
  Promise.resolve().then(() => {
    throw new Error('err')
  })
} catch (err) {
  console.log(err);
}


反正就是不知道咋回事,我之前的知识储备中就是没有这个知识点:try...catch不能异步捕获代码错误,因为它本身就是一个同步代码块。所以看到这道题我就懵了,平时代码不就是这样写的吗,用try...catch来捕获错误,所以当时就直接回了我不知道,感觉没有啥错误。。。,面试官无奈的看了我一眼,下来可以了解一下,然后就没有然后了。


下来我就赶紧查了资料,才知道try...catch不能异步捕获代码错误。在 JavaScript 中,setTimeout 是一个异步函数,它的回调函数会在指定的延时后被放入事件队列,等待当前执行栈清空后才执行。因此,当setTimeout的回调函数执行并抛出错误时,try...catch已经执行完毕,无法捕捉到异步回调中的错误。


正确的做法是在异步操作中直接处理错误,例如使用回调函数、Promises 或者 async/await 结合 try...catch

new Promise((resolve, reject) => {
  setTimeout(() => {
    try {
      throw new Error('err');
    } catch (err) {
      reject(err);
    }
  }, 200);
})
  .then(() => {
    // 正常执行时的处理逻辑
  })
  .catch((err) => {
    console.log(err); // 这里会捕捉到错误
  });


至于第二个例子,尝试使用try...catch来捕捉一个在Promise链中抛出的错误。这种方式同样是无效的,因为try...catch不能捕捉到在Promise链中的异步错误。


Promise 对象用于表示一个异步操作的最终完成(或失败),及其结果值。一个Promise的状态可能是以下几种:

Pending(等待态) :初始状态,既不是成功,也不是失败状态。

Fulfilled(成功态) :意味着操作成功完成。

Rejected(失败态) :意味着操作失败。

在Promise中抛出一个错误(例如通过throw语句)会导致Promise被拒绝(或失败)。要正确处理这个错误,需要在Promise链中使用.catch方法或者在一个async函数中使用try...catch。

// 方法一
Promise.resolve()
  .then(() => {
    throw new Error('err');
  })
  .catch((err) => {
    console.log(err); // 这里会捕捉到错误
  });

// 方法二
async function handleError() {
  try {
    await Promise.resolve().then(() => {
      throw new Error('err');
    });
  } catch (err) {
    console.log(err); // 这里会捕捉到错误
  }
}
 
handleError();



扫描二维码推送至手机访问。

版权声明:本文由星星博客发布,如需转载请注明出处。

本文链接:https://www.xingxinghan.cn/?id=512

分享给朋友:

“Javascript try catch的使用” 的相关文章

JavaScript中的setTimeout和setInterval

JavaScript是一门广泛应用于网页开发的脚本语言,它提供了许多强大的功能和特性。其中,setTimeout和setInterval是两个常用的定时器函数,它们可以在指定的时间间隔内执行代码。本文将深入探讨这两个函数的用法和特点,并通过代码示例来加深理解。...

JavaScript中的call、bind和apply方法深度解析

JavaScript是一种动态的、强大的编程语言,它的灵活性源于其独特的函数调用方式。在JavaScript中,我们常常会遇到三个非常重要的函数方法:call、bind和apply。这些方法都是用来改变函数运行时this的指向的。理解它们的工作原理和使用场景,对于我们编写高质量的Java...

typescript 中 omit 的理解

在 TypeScript 中,Omit 是一种非常有用的工具类型,它可以用于创建一个新的类型,这个新类型是从现有类型中排除了指定的属性后得到的。如果你想要处理一个对象但又不需要包含某些属性,那么 Omit 可以帮助你快速地创建一个新的类型。 比如说,...

webSocket 实现持久连接,原理解析

WebSocket 是一种用于实现持久连接的通信协议,它的原理和工作方式相对复杂,但我们可以尝试以尽可能简单和清晰的方式来解释它。 WebSocket 的原理 在理解 WebSocket 的工作原理之前,我们首先要了解 HTTP 协...

JS forEach 如何跳出循环

for循环 JavaScript中,for循环可以使用 break 和 continue 来跳出: continue:跳出本次循环...

深入剖析JavaScript中的堆栈、事件循环、执行上下文、作用域和闭包

Document1. 堆栈在JavaScript中,内存堆是内存分配的地方,调用栈是代码执行的地方。原始类型的保存方式:在变量中保存的是值本身,所以原始类型也被称之为值类型。对象类型的保存方式:在变量中保存的是对象的“引用”,所以对象类型也被称之为引用类型。调用栈理解非常简单,当遇见一个方法时推入调...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。