国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端異常錯(cuò)誤處理(包括但不限于react,vue)

這篇具有很好參考價(jià)值的文章主要介紹了前端異常錯(cuò)誤處理(包括但不限于react,vue)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

錯(cuò)誤異常發(fā)生

  • 頁(yè)面js報(bào)錯(cuò)
  • 請(qǐng)求報(bào)錯(cuò)
  • 頁(yè)面資源加載報(bào)錯(cuò)
  • promise異常
  • iframe加載異常
  • 頁(yè)面奔潰&卡頓異常

處理異常的方法

1、react 自帶的errorBoundaries
2、 react 自定義Hooks
3、 vue errorHandler
4、try catch 對(duì)特定的代碼進(jìn)行捕獲
5、window.addEventListerner
6、window.onerror
7、 window.unhandledrejection
8、 iframe錯(cuò)誤處理
9、跨域錯(cuò)誤處理
10、頁(yè)面奔潰卡頓處理
11、 統(tǒng)一上報(bào)錯(cuò)誤(不會(huì)有跨域問(wèn)題

ps: 在開(kāi)發(fā)環(huán)境下,語(yǔ)法錯(cuò)誤一般會(huì)在編輯器中直接拋出,導(dǎo)致程序奔潰,能夠得到及時(shí)的處理。

1、react errorBoundaries錯(cuò)誤邊界

可以捕獲發(fā)生在其子組件樹(shù)任何位置的 JavaScript 錯(cuò)誤,并打印這些錯(cuò)誤,同時(shí)展示降級(jí) UI.
而并不會(huì)渲染那些發(fā)生崩潰的子組件樹(shù)。錯(cuò)誤邊界可以捕獲發(fā)生在整個(gè)子組件樹(shù)的渲染期間、生命周期方法以及構(gòu)造函數(shù)中的錯(cuò)誤。

引用官方文檔實(shí)例:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }
  static getDerivedStateFromError(error) {
    // 更新 state 使下一次渲染能夠顯示降級(jí)后的 UI
    return { hasError: true };
  }
  componentDidCatch(error, errorInfo) {
    // 你同樣可以將錯(cuò)誤日志上報(bào)給服務(wù)器
    logErrorToMyService(error, errorInfo);
  }
  render() {
    if (this.state.hasError) {
      // 你可以自定義降級(jí)后的 UI 并渲染
      return <h1>Something went wrong.</h1>;
    }
    return this.props.children; 
  }
}

無(wú)法捕獲到的錯(cuò)誤:
事件處理
異步代碼(setTimeout或requestAnimationFrame回調(diào)函數(shù))
服務(wù)端渲染
自身拋出來(lái)的錯(cuò)誤

2、react 自定義Hooks

const useThrowAsyncError = () => {
	const [state, setState] = useState();
	return (error) => {
		setState(() => throw error)
	}
}

使用:引入該hook

throwAsyncError(e)

自己封裝hook,然后自己去調(diào)用setState throw把錯(cuò)誤拋出去,調(diào)用setState會(huì)重新渲染,就會(huì)把錯(cuò)誤拋出去,就是在渲染周期內(nèi)了,errorBoundaries就能捕獲到了

3、errorHandler

vue主要是通過(guò)errorCaptured鉤子來(lái)捕獲錯(cuò)誤,通過(guò)errorHandler處理錯(cuò)誤。
errorCaptured是捕獲一個(gè)來(lái)自子孫組件的錯(cuò)誤時(shí)被調(diào)用。

vue.config.errorHandler((err, vm, info) => {
	// err錯(cuò)誤對(duì)象
	// vm 發(fā)生錯(cuò)誤的組件實(shí)例
	// info 一個(gè)包含錯(cuò)誤來(lái)源信息的字符串
	// false 該錯(cuò)誤不會(huì)繼續(xù)向上傳播
	return false
})

只能捕獲到同步的代碼錯(cuò)誤,異步錯(cuò)誤需要用到裝飾器。

4、 try catch 對(duì)特定的代碼進(jìn)行捕獲

try-catch適合處理一些無(wú)法控制的錯(cuò)誤,比如網(wǎng)絡(luò)請(qǐng)求、各種I/O操作等。將代碼中有可能發(fā)生錯(cuò)誤的放在try語(yǔ)句塊中,一旦發(fā)生異常,就將控制權(quán)轉(zhuǎn)交給catch塊執(zhí)行,然后繼續(xù)執(zhí)行后續(xù)任務(wù),不會(huì)阻塞進(jìn)程。

try{
	//可能發(fā)生錯(cuò)誤代碼
} catch (err) {
	// 捕獲
}

但try中發(fā)生的錯(cuò)誤及異步任務(wù)、語(yǔ)法錯(cuò)誤,catch捕獲不到

5、 window.addEventListerner

<script>
window.addEventListener('error', (error) => {
 console.log('捕獲到異常:', error);
}, true)
</script>
<img src="./xxxx.png">

返回的是errorEvent事件對(duì)象

6. window.onerror

js運(yùn)行時(shí),沒(méi)有被try.catch捕獲到的,一般會(huì)在window.onerror中捕獲到

/**
* @param {String}  message    錯(cuò)誤信息
* @param {String}  source    出錯(cuò)文件
* @param {Number}  lineno    行號(hào)
* @param {Number}  colno    列號(hào)
* @param {Object}  error  Error對(duì)象(對(duì)象)
*/
window.onerror = function(message, source, lineno, colno, error) {
   console.log('捕獲到異常:',{message, source, lineno, colno, error});
   return true
}

1.window.onerror 函數(shù)只有在返回 true 的時(shí)候,異常才不會(huì)向上拋出(瀏覽器接收后報(bào)紅),否則即使是知道異常的發(fā)生控制臺(tái)還是會(huì)顯示 Uncaught Error: xxxxx
2.window.onerror 最好寫(xiě)在所有JS腳本的前面,否則有可能捕獲不到錯(cuò)誤
3.window.onerror無(wú)法捕獲語(yǔ)法錯(cuò)誤

7. unhandledrejection

當(dāng) Promise 被 reject 且沒(méi)有 reject 處理器的時(shí)候,會(huì)觸發(fā) unhandledrejection 事件;這可能發(fā)生在 window 下,但也可能發(fā)生在 Worker 中。發(fā)生在promise塊中的錯(cuò)誤,無(wú)論是否catch,都會(huì)觸發(fā)unhandledrejection事件。

window.addEventListener("unhandledrejection", event => {
  console.warn(`UNHANDLED PROMISE REJECTION: ${event.reason}`);
});

window.onunhandledrejection=function()=>{}

8. iframe錯(cuò)誤處理

window.frame[0].onerror = function(message, source) => {}

9、跨域錯(cuò)誤處理

script Error?當(dāng)引用第三方script的時(shí)候,腳本出現(xiàn)錯(cuò)誤,直接提示“script error”。

解決1:設(shè)置crossorigin=”anonymous”,在非同源情況下,設(shè)置 “anonymous” 關(guān)鍵字將不會(huì)通過(guò) cookies,客戶(hù)端 SSL 證書(shū)或 HTTP 認(rèn)證交換用戶(hù)憑據(jù)。但是這個(gè)屬性并不是所有瀏覽器都支持(CORS settings attributes - HTML(超文本標(biāo)記語(yǔ)言))。
解決2:將第三方腳本方法放在try-catch里。

10、頁(yè)面奔潰卡頓處理

1.利用 window 對(duì)象的 load 和 beforeunload 事件實(shí)現(xiàn)了網(wǎng)頁(yè)崩潰的監(jiān)控。
不錯(cuò)的文章,推薦閱讀:http://jasonjl.me/blog/2015/06/21/taking-action-on-browser-crashes/。

window.addEventListener('load', function () {
    sessionStorage.setItem('good_exit', 'pending');
    setInterval(function () {
        sessionStorage.setItem('time_before_crash', new Date().toString());
    }, 1000);
  });
  window.addEventListener('beforeunload', function () {
    sessionStorage.setItem('good_exit', 'true');
  });
  if(sessionStorage.getItem('good_exit') &&
    sessionStorage.getItem('good_exit') !== 'true') {
    /*
        insert crash logging code here
    */
    alert('Hey, welcome back from your crash, looks like you crashed on: ' + sessionStorage.getItem('time_before_crash'));
  }

11、統(tǒng)一上報(bào)錯(cuò)誤(不會(huì)有跨域問(wèn)題)

利用img 的 src請(qǐng)求不跨域

function report(error) {
	const reportUrl = 'http://xxx/report/'
	new Image().src = `${reportUrl}?logs=${error}`
}

ps: img的src和script的src: 原理是相同的,都是利用標(biāo)簽的src屬性可以跨域請(qǐng)求的特點(diǎn),但是不同的是:
使用img標(biāo)簽不能訪問(wèn)服務(wù)器返回的響應(yīng)內(nèi)容,也就是說(shuō)只能單向的發(fā)送get請(qǐng)求;
而使用script標(biāo)簽實(shí)現(xiàn)的jsonp跨域可以將服務(wù)器響應(yīng)文本以函數(shù)參數(shù)的形式返回,瀏覽器解析js代碼時(shí)直接就執(zhí)行了。

總結(jié):

1、可疑代碼添加 try…catch
2、全局監(jiān)控JS異常: window.onerror
3、全局監(jiān)控靜態(tài)資源異常: window.addEventListener
4、全局捕獲沒(méi)有 catch 的 promise 異常:unhandledrejection
5、iframe 異常:window.error
6、VUE errorHandler 和 React componentDidCatch
7、監(jiān)控網(wǎng)頁(yè)崩潰:window 對(duì)象的 load 和 beforeunload
8、Script Error 跨域用 crossOrigin 解決
9、統(tǒng)一錯(cuò)誤上報(bào),通過(guò)new image().src文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-603570.html

到了這里,關(guān)于前端異常錯(cuò)誤處理(包括但不限于react,vue)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 如何進(jìn)行錯(cuò)誤處理和異常處理?

    錯(cuò)誤處理和異常處理是編程中非常重要的概念,它們?cè)试S我們?cè)诔绦蜻\(yùn)行時(shí)處理各種問(wèn)題和異常情況,以確保程序的穩(wěn)定性和可靠性。在C語(yǔ)言中,錯(cuò)誤處理和異常處理通常通過(guò)條件語(yǔ)句和函數(shù)來(lái)實(shí)現(xiàn)。本文將詳細(xì)討論C語(yǔ)言中的錯(cuò)誤處理和異常處理的方法,包括錯(cuò)誤類(lèi)型、處

    2024年02月09日
    瀏覽(35)
  • JavaScript 常見(jiàn)錯(cuò)誤與異常處理

    1、調(diào)試和故障排除: 了解常見(jiàn)的JavaScript錯(cuò)誤可以幫助你更好地調(diào)試和故障排除代碼。當(dāng)你遇到錯(cuò)誤時(shí),能夠快速識(shí)別錯(cuò)誤類(lèi)型并找到解決方法,可以節(jié)省大量的時(shí)間和精力。 2、代碼質(zhì)量和穩(wěn)定性: 通過(guò)了解常見(jiàn)的JavaScript錯(cuò)誤,你可以編寫(xiě)更健壯和穩(wěn)定的代碼。你可以預(yù)先

    2024年02月03日
    瀏覽(21)
  • vue項(xiàng)目 前端加前綴(包括頁(yè)面及靜態(tài)資源)

    具體步驟 (1)更改router模式,添加前綴 位置:router文件夾下面的index.js (2)實(shí)現(xiàn)靜態(tài)文件加前綴 位置:vue.config.js 靜態(tài)資源css,js之類(lèi)的的src或href引用位置會(huì)加上這個(gè)前綴,會(huì)體現(xiàn)在打包后的index.html文件內(nèi)容 例如 (3)nignx配置

    2024年02月04日
    瀏覽(52)
  • Junit 單元測(cè)試之錯(cuò)誤和異常處理

    錯(cuò)誤和異常處理是測(cè)試中非常重要的部分。假設(shè)我們有一個(gè)服務(wù),該服務(wù)從數(shù)據(jù)庫(kù)中獲取用戶(hù)?,F(xiàn)在,我們要考慮的錯(cuò)誤場(chǎng)景是:數(shù)據(jù)庫(kù)連接斷開(kāi)。 首先,為了簡(jiǎn)化,我們讓服務(wù)層就是簡(jiǎn)單的類(lèi),然后使用Id查找用戶(hù),這個(gè)和之前測(cè)試UserService接口不太一樣哦: 現(xiàn)在,我們要

    2024年02月08日
    瀏覽(12)
  • 【VUE】Unterminated template literal:拼接字符串包括<script></script>時(shí)報(bào)錯(cuò)誤

    【VUE】Unterminated template literal:拼接字符串包括<script></script>時(shí)報(bào)錯(cuò)誤

    vue拼接字符串包括script標(biāo)簽時(shí)報(bào)錯(cuò)誤提示Unterminated template literal解決方法加反斜杠就可以,在script結(jié)束標(biāo)簽里邊加反斜杠 /script

    2024年02月13日
    瀏覽(25)
  • php捕獲Fatal error錯(cuò)誤與異常處理

    在php5的版本中,如果出現(xiàn)致命錯(cuò)誤是無(wú)法被 try {} catch 捕獲的,如下所示: 運(yùn)行腳本,最終php報(bào)出一個(gè)Fatal error,并程序中止 有些時(shí)候,我們需要捕獲這種錯(cuò)誤,并做相應(yīng)的處理。 那就需要用到?register_shutdown_function() 和?error_get_last() 來(lái)捕獲錯(cuò)誤 對(duì)于php7中的錯(cuò)誤捕獲,因?yàn)?/p>

    2024年02月19日
    瀏覽(23)
  • Python中處理HTTP異常和錯(cuò)誤的策略

    Python中處理HTTP異常和錯(cuò)誤的策略

    在Python中處理HTTP異常和錯(cuò)誤是一項(xiàng)至關(guān)重要的任務(wù),它關(guān)乎到應(yīng)用程序的健壯性、用戶(hù)體驗(yàn)以及數(shù)據(jù)的安全性。HTTP請(qǐng)求可能會(huì)遭遇多種異常和錯(cuò)誤,如連接錯(cuò)誤、超時(shí)、HTTP狀態(tài)碼錯(cuò)誤等。為了有效地處理這些異常和錯(cuò)誤,開(kāi)發(fā)者需要采取一系列策略。 1. 使用try-except捕獲異

    2024年02月22日
    瀏覽(28)
  • Kotlin Android中錯(cuò)誤及異常處理最佳實(shí)踐

    Kotlin Android中錯(cuò)誤及異常處理最佳實(shí)踐

    Kotlin在Android開(kāi)發(fā)中的錯(cuò)誤處理機(jī)制以及其優(yōu)勢(shì) Kotlin具有強(qiáng)大的錯(cuò)誤處理功能 :Kotlin提供了強(qiáng)大的錯(cuò)誤處理功能,使處理錯(cuò)誤變得簡(jiǎn)潔而直接。這個(gè)特性幫助開(kāi)發(fā)人員快速識(shí)別和解決錯(cuò)誤,減少了調(diào)試代碼所需的時(shí)間。 Kotlin的錯(cuò)誤處理特性 :Kotlin具有一些錯(cuò)誤處理特性,如

    2024年02月07日
    瀏覽(32)
  • Python基礎(chǔ)合集 練習(xí)21 (錯(cuò)誤與異常處理語(yǔ)句)

    Python基礎(chǔ)合集 練習(xí)21 (錯(cuò)誤與異常處理語(yǔ)句)

    ‘’‘try: block1 except[ExceptionName]: block2 ‘’’ while True: try: num = int(input(\\\'請(qǐng)輸入一個(gè)數(shù): \\\')) result = 50 / num print(result) print(‘50/{0}={1}’.format(num, result)) exit() # 退出程序 except ZeroDivisionError: print(‘除數(shù)不能為0,請(qǐng)重新輸入’) while True: try: num = int(input(\\\'請(qǐng)輸入一個(gè)數(shù): \\\')) result = 50 /

    2024年02月02日
    瀏覽(27)
  • 深度解析C++異常處理機(jī)制:分類(lèi)、處理方式、常見(jiàn)錯(cuò)誤及11新增功能

    異常是程序在運(yùn)行過(guò)程中出現(xiàn)非正常情況的處理機(jī)制。當(dāng)出現(xiàn)異常時(shí)程序會(huì)停止運(yùn)行并調(diào)用異常處理程序。 異??梢苑譃閮?nèi)置異常和自定義異常 2.1 內(nèi)置異常 C++ 標(biāo)準(zhǔn)庫(kù)提供了許多預(yù)定義的異常類(lèi),稱(chēng)為內(nèi)置異常,包括以下幾種: std::exception :所有標(biāo)準(zhǔn)異常類(lèi)的基類(lèi)。 std::

    2024年01月18日
    瀏覽(33)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包