欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript前端常見異常及如何捕獲詳解

 更新時間:2024年03月06日 16:22:11   作者:Aggie1468991348000  
這篇文章主要為大家詳細介紹了JavaScript前端中的常見異常以及如何捕獲這些異常,文中的示例代碼講解詳細,需要的小伙伴可以參考一下

全局捕獲-架構側

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

局部捕獲-業(yè)務側

可疑代碼塊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); //這里不會執(zhí)行
  } catch (e) {
    console.log("e:", e); //這里不會執(zhí)行
  }
}
fn();
let p1 = new Promise(async (resolve, reject) => {
  return reject(100); // 未被捕獲,會拋出全局異常:ERR_UNHANDLED_REJECTION
});
function fn() {
  try {
    let result = p1;
    console.log(2, result); //這里不會執(zhí)行
  } catch (e) {
    console.log("e:", e); //這里不會執(zhí)行
  }
}
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); //這里不會執(zhí)行
  } catch (e) {
    console.log("e:", e); //這里不會執(zhí)行
  }
}
fn();
let p1 = new Promise(async (resolve, reject) => {
  return Promise.reject(100); // 未被捕獲,會拋出全局異常:ERR_UNHANDLED_REJECTION
}).catch((e) => {
  console.log("promise out e", e); // 這里不會執(zhí)行
});
async function fn() {
  try {
    let result = await p1;
    console.log(2, result); //這里不會執(zhí)行
  } catch (e) {
    console.log("e:", e); //這里不會執(zhí)行
  }
}
fn();

Promise里同步拋出的異常,會觸發(fā)Promise.reject而被捕獲。但異步拋出的異常,不會觸發(fā)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 請求,自行處理自定義的異常上報

全局靜態(tài)資源異常監(jiān)控

window.addEventListener("error") 或者資源標簽的onError屬性

到此這篇關于JavaScript前端常見異常及如何捕獲詳解的文章就介紹到這了,更多相關JavaScript異常捕獲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 微信小程序保存圖片到相冊權限設置

    微信小程序保存圖片到相冊權限設置

    這篇文章主要為大家詳細介紹了微信小程序保存圖片到相冊權限設置,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • 微信小程序實現左右聯動

    微信小程序實現左右聯動

    這篇文章主要為大家詳細介紹了微信小程序實現左右聯動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Bootstrap 表單驗證formValidation 實現表單動態(tài)驗證功能

    Bootstrap 表單驗證formValidation 實現表單動態(tài)驗證功能

    這篇文章主要介紹了Bootstrap 表單驗證formValidation 實現表單動態(tài)驗證功能,需要的朋友可以參考下
    2017-05-05
  • JavaScript裝箱及拆箱boxing及unBoxing用法解析

    JavaScript裝箱及拆箱boxing及unBoxing用法解析

    這篇文章主要介紹了JavaScript裝箱及拆箱boxing及unBoxing用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 基于JavaScript實現熔巖燈效果導航菜單

    基于JavaScript實現熔巖燈效果導航菜單

    這篇文章主要介紹了基于JavaScript實現熔巖燈效果導航菜單,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • JS簡單獲取及顯示當前時間的方法

    JS簡單獲取及顯示當前時間的方法

    這篇文章主要介紹了JS簡單獲取及顯示當前時間的方法,涉及javascript針對日期與時間的獲取與運算相關操作技巧,需要的朋友可以參考下
    2016-08-08
  • document.getElementById介紹

    document.getElementById介紹

    經常使用document.getElementById,但對于更詳細的細節(jié)可以參考下。
    2011-09-09
  • 基于ES6 Array.of的用法(實例講解)

    基于ES6 Array.of的用法(實例講解)

    下面小編就為大家?guī)硪黄贓S6 Array.of的用法(實例講解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • js中異步函數async function變同步函數的簡單入門

    js中異步函數async function變同步函數的簡單入門

    這篇文章主要介紹了js中異步函數async function變同步函數的簡單入門,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • date.parse在IE和FF中的區(qū)別

    date.parse在IE和FF中的區(qū)別

    這個方法是很常用的,比如在驗證輸入日期是否存在時,可以使用它,如果是一個不存在的日期,則其返回值將是NaN,另外如果要比較兩個日期的先后,或是計算兩個日期相差的天數 ,都可以用到。
    2010-07-07

最新評論