当前位置: 代码网 > it编程>编程语言>Javascript > JavaScript前端常见异常及如何捕获详解

JavaScript前端常见异常及如何捕获详解

2024年05月19日 Javascript 我要评论
全局捕获-架构侧js全局异常捕获:window.oneerror 和 window.addeventlisenter('error')promise全局异常捕获:unhandledre

全局捕获-架构侧

js全局异常捕获:window.oneerror 和 window.addeventlisenter('error')

promise全局异常捕获:unhandledrejection

框架级的全局异常捕获

react:reacterrorboundary

// errorboundary的示例
class errorboundary extends react.component {
    constructor(props) {
      super(props);
      this.state = { haserror: false };
    }
  
    componentdidcatch(error, info) {
      this.setstate({ haserror: true });
      // 在这里可以做异常的上报
      logerrortomyservice(error, info);
    }
  
    render() {
      if (this.state.haserror) {
        return <h1>something went wrong.</h1>;
      }
      return this.props.children;
  }
  
  <errorboundary>
    <mywidget />
  </errorboundary>

vue:vuevue.config.errorhandler

axios: 请求统一底层封装异常处理拦截器 interceptors

全局捕获-框架层

vue 用 errorhandler 和 react 用 componentdidcatch

局部捕获-业务侧

可疑代码块try-catch

try catch能捕获捉到运行时非异步错误,无法捕获语法错误和异步错误。这个需要注意。

合理使用,不要过度使用。有得异常需要抛出去给外部处理。

常见的需要注意用try-catch包裹,捕获异常的情况

json处理必须使用try catch捕获异常

try {
  const res=fetch(*)
  json.parse(res); // res 为服务端返回的数据
} catch(e) {
   // 捕获到详细的错误,在这里处理日志上报或其他异常处理等逻辑,如是否提示用户,是否有异常下的兜底数据,比如使用缓存数据等
  console.error("服务端数据格式返回异常,无法解析", res);
  
}

// 注意:下面的异常try catch无法捕获

try {
  settimeout(() => {
    undefined.map(v => v);
  }, 1000)
} catch(e) {
  console.log("捕获到异常:", e);
}

async await异步请求

正则表达式处理

buffer处理

promise异常

注意未被捕获的promise异常会作为全局异常抛出。

局部promise捕获两种方式:

// 1. promise().catch()
let promise = new promise((resolve,reject)=>{}).catch(e=>{
   // handle error
})

// 2. async/await + try/catch
let promise = new promise();
async function test() {
  try {
    await promise;
  } catch (e) {
    // handle error
  }
}

用promise().catch(),

全局promise异常用window.addeventlistener("unhandledrejection")

注意:

promise自己的异常只能被自己catch, 或在try/catch里以await的方式调用来捕获。否则就会作为err_unhandled_rejection异常抛出到全局。

外层promise不能不能捕获内层promise的异常。

let p1 = new promise(async (resolve, reject) => {
  return reject(100); // 被捕获
});
async function fn() {
  try {
    let result = await p1;
    console.log(2, result); //这里不会执行
  } catch (e) {
    console.log("e:", e); //这里不会执行
  }
}
fn();
let p1 = new promise(async (resolve, reject) => {
  return reject(100); // 未被捕获,会抛出全局异常:err_unhandled_rejection
});
function fn() {
  try {
    let result = p1;
    console.log(2, result); //这里不会执行
  } catch (e) {
    console.log("e:", e); //这里不会执行
  }
}
fn();
let p1 = new promise(async (resolve, reject) => {
  console.log("after reject");
  return promise.reject(100); // 未被捕获,会抛出全局异常:err_unhandled_rejection
});
async function fn() {
  try {
    let result = await p1;
    console.log(2, result); //这里不会执行
  } catch (e) {
    console.log("e:", e); //这里不会执行
  }
}
fn();
let p1 = new promise(async (resolve, reject) => {
  return promise.reject(100); // 未被捕获,会抛出全局异常:err_unhandled_rejection
}).catch((e) => {
  console.log("promise out e", e); // 这里不会执行
});
async function fn() {
  try {
    let result = await p1;
    console.log(2, result); //这里不会执行
  } catch (e) {
    console.log("e:", e); //这里不会执行
  }
}
fn();

promise里同步抛出的异常,会触发promise.reject而被捕获。但异步抛出的异常,不会触发promise.reject,因此不会被捕获。

new promise((resolve, reject) => {
  throw new error("error1"); // 等效于reject
}).catch((e) => {
  console.log("异常被捕获到了1");
});

new promise(async (resolve, reject) => {
  reject(new error("error2"));
}).catch((e) => {
  console.log("异常被捕获到了2");
});

new promise(async () => {
  throw new error("error3");
}).catch((e) => {
  console.log("异常被捕获到了3");
});

接口请求异常

fetch 用async await + try catch

axios 请求,自行处理自定义的异常上报

全局静态资源异常监控

window.addeventlistener("error") 或者资源标签的onerror属性

到此这篇关于javascript前端常见异常及如何捕获详解的文章就介绍到这了,更多相关javascript异常捕获内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com