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

前端錯誤收集與處理

這篇具有很好參考價值的文章主要介紹了前端錯誤收集與處理。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

做好錯誤監(jiān)控,將用戶使用時的錯誤日志上報,可以幫助我們更快的解決一些問題。

那前端監(jiān)控是怎么實現(xiàn)的呢?要想了解這個,需要知道前端錯誤大概分為哪些以及如何捕獲處理。

前端錯誤分為JS運行時錯誤、資源加載錯誤和接口錯誤三種。

本文檔介紹有關(guān)js的錯誤類型、錯誤事件、vue3的app.config.errorHandler全局處理函數(shù)。

用nodejs+Express模擬接口,將監(jiān)聽到的錯誤信息發(fā)送到nodejs寫的接口里,再通過一個getErrorList接口展示錯誤信息列表。

js的錯誤對象和onerror事件

2.1錯誤對象類型

ECMA-262定義了下列7種錯誤類型:https://baike.baidu.com/item/ECMAScript/1889420?fr=aladdin

Error() // 基類型

EvalError() // eval錯誤

RangeError() // 范圍錯誤

ReferenceError() // 引用錯誤

SyntaxError() // 語法錯誤

TypeError() // 類型錯誤

URIError() // URI錯誤

Error: 所有錯誤類型的父類型。

SyntaxError: 語法錯誤,表示程序的語法使用錯誤。

console.log(【】) ; VM115:1 Uncaught SyntaxError: Invalid or unexpected token

ReferenceError: 引用錯誤,表示引用的變量不存在。

console.log(a) ; VM274:1 Uncaught ReferenceError: a is not defined at <anonymous>:1:13

TypeError: 類型錯誤,表示使用了錯誤的數(shù)據(jù)類型。

let a;
console.log(a.name); 
VM279:2 Uncaught TypeError: Cannot read properties of undefined (reading 'name')
    at <anonymous>:2:15

RangeError:范圍錯誤, 數(shù)據(jù)值不在其所允許的范圍內(nèi)(函數(shù)遞歸調(diào)用容易出現(xiàn)此錯誤)。

(10.24).toFixed(-1)
VM363:2 Uncaught RangeError: toFixed() digits argument must be between 0 and 100
    at Number.toFixed (<anonymous>)
    at <anonymous>:2:9

URIError: URI錯誤,向全局 URI 處理函數(shù)(decodeURI、decodeURIComponent)傳遞一個不合法的URI時,URIError 錯誤會被拋出。

// 解碼URI地址   錯誤:格式不正確
console.log(decodeURI("%") );
VM368:2 Uncaught URIError: URI malformed
    at decodeURI (<anonymous>)
    at <anonymous>:2:13

EvelError: eval函數(shù)執(zhí)行錯誤 EvalError 不在當(dāng)前ECMAScript規(guī)范中使用,因此不會被運行時拋出。但是對象本身仍然與規(guī)范的早期版本向后兼容。

通過error的構(gòu)造器可以創(chuàng)建一個錯誤對象。如 new error() throw new Error(); 這個是創(chuàng)建錯誤,創(chuàng)造一個錯誤類型拋出。

app.config.errorhandler,前端,javascript,開發(fā)語言

?

// 拋出的地方
function parseExcel(con) {
   try {
        // doSomething
    } catch (error) {
        throw new Error('parse excel failed');
    }
}
// 捕獲的地方 
try {
    parseExcel(con);
} catch (error) {
    if (error.message === 'parse excel failed') {
        //doSomething
    }
}

2.2Error對象

--error 對象是當(dāng)錯誤發(fā)生時提供錯誤信息的 JS 內(nèi)置對象。

當(dāng)錯誤發(fā)生時,瀏覽器會生成 error 對象并拋出,并且中斷后面代碼的執(zhí)行。

console.log(js)
console.log('中斷后面代碼的執(zhí)行,不會被執(zhí)行到')
VM488:1 Uncaught ReferenceError: js is not defined
    at <anonymous>:1:13

任何沒有通過try-catch處理的錯誤都會觸發(fā)window對象的error事件。

error事件接收五個參數(shù):

message:錯誤信息(字符串)

source:發(fā)生錯誤的腳本URL(字符串)

lineno:發(fā)生錯誤的行號(數(shù)字)

colno:發(fā)生錯誤的列號(數(shù)字)

error:Error對象(對象)

app.config.errorhandler,前端,javascript,開發(fā)語言

?app.config.errorhandler,前端,javascript,開發(fā)語言

?

圖像也支持error事件。

var img = new Image()
img.src='a.jpg'
img.onerror = function(e) {
  console.log(e)
}

2.3資源加載失敗

window.addEventListener 當(dāng)一項資源(如圖片或腳本)加載失敗,加載資源的元素會觸發(fā)一個 Event 接口的 error 事件,這些 error 事件不會向上冒泡到 window,但能被捕獲。而window.onerror不能監(jiān)測捕獲。

// 圖片、script、css加載錯誤,都能被捕獲 ?
<script>
  window.addEventListener('error', (error) => {
     console.log('捕獲到異常:', error);
  }, true)
</script>
<img src="https://yun.tuia.cn/image/kkk.png">
<script src="https://yun.tuia.cn/foundnull.js"></script>
<link  rel="stylesheet"/>
  
// new Image錯誤,不能捕獲 ?
<script>
  window.addEventListener('error', (error) => {
    console.log('捕獲到異常:', error);
  }, true)
</script>
<script>
  new Image().src = 'https://yun.tuia.cn/image/lll.png'
</script>

// fetch錯誤,不能捕獲 ?
<script>
  window.addEventListener('error', (error) => {
    console.log('捕獲到異常:', error);
  }, true)
</script>
<script>
  fetch('https://tuia.cn/test')
</script>

到目前為止,還有語法錯誤、promise異步錯誤、new Image資源加載錯誤還沒有捕獲方法。

語法錯誤可以在開發(fā)階段依靠編輯器發(fā)現(xiàn)。

new Image運用的比較少,可以單獨自己處理自己的錯誤,可以通過img.onerror = fn來單獨處理。

但通用的fetch怎么辦呢,fetch返回Promise,但Promise的錯誤不能被捕獲,怎么辦呢?

Promise錯誤

1.普通Promise錯誤

try/catch不能捕獲Promise中的錯誤

// try/catch 不能處理 JSON.parse 的錯誤,因為它在 Promise 中
try {
  new Promise((resolve,reject) => { 
    JSON.parse('')
    resolve();
  })
} catch(err) {
  console.error('in try catch', err)
}

// 需要使用catch方法
new Promise((resolve,reject) => { 
  JSON.parse('')
  resolve();
}).catch(err => {
  console.log('in catch fn', err)
})

2.async錯誤

try/catch不能捕獲async包裹的錯誤

const getJSON = async () => {
  throw new Error('inner error')
}

// 通過try/catch處理
const makeRequest = async () => {
    try {
        // 捕獲不到
        JSON.parse(getJSON());
    } catch (err) {
        console.log('outer', err);
    }
};

try {
    // try/catch不到
    makeRequest()
} catch(err) {
    console.error('in try catch', err)
}

try {
    // 需要await,才能捕獲到
    await makeRequest()
} catch(err) {
    console.error('in try catch', err)
}

3.import chunk錯誤

import其實返回的也是一個promise,因此使用如下兩種方式捕獲錯誤

// Promise catch方法
import(/* webpackChunkName: "incentive" */'./index').then(module => {
    module.default()
}).catch((err) => {
    console.error('in catch fn', err)
})

// await 方法,try catch
try {
    const module = await import(/* webpackChunkName: "incentive" */'./index');
    module.default()
} catch(err) {
    console.error('in try catch', err)
}

小結(jié):全局捕獲Promise中的錯誤

以上三種其實歸結(jié)為Promise類型錯誤,可以通過unhandledrejection捕獲。 為了防止有漏掉的 Promise 異常,可通過unhandledrejection用來全局監(jiān)聽Uncaught Promise Error。

// 全局統(tǒng)一處理Promise
window.addEventListener("unhandledrejection", function(e){
  console.log('捕獲到異常:', e);
});
fetch('https://tuia.cn/test')

當(dāng)promise被reject并且錯誤信息沒有被處理的時候,會拋出一個unhandledrejection,并且這個錯誤不會被window.onerror以及window.addEventListener('error')捕獲,需要用專門的window.addEventListener('unhandledrejection')捕獲處理。

window.addEventListener('unhandledrejection', event => 
    { 
       console.log('unhandledrejection:' + event.reason); // 捕獲后自定義處理
    });

https://developer.mozilla.org... 例子: http://sandbox.runjs.cn/show/eatrbc1w 請打開頁面打開控制臺查看。點擊button拋出unhandledrejection錯誤,并且該錯誤僅能被window.addEventListener('unhandledrejection')捕獲。

Uncaught RangeError: Maximum call stack

這是Chrome瀏覽器在幾種情況下出現(xiàn)的錯誤,一種是調(diào)用不終止的遞歸函數(shù)。你可以在Chrome開發(fā)者控制臺中對此進(jìn)行測試。

8、js FileReader 讀取文件錯誤處理

const reader = new FileReader()

reader.onload = ()=>{}

reader.οnerrοr= ()=>{}

9、圖片onerror事件

img標(biāo)簽支持onerror 事件,在裝載文檔或圖像的過程中如果發(fā)生了錯誤,就會觸發(fā)onerror事件??梢允褂靡粡?zhí)崾惧e誤的圖片代替顯示不了的圖片。

10、其他資源的onerror事件---腳本、iframe等

瀏覽器允許我們跟蹤外部資源的加載 —— 腳本,iframe,圖片等。

因此,在 onload 中我們可以使用腳本中的變量,運行函數(shù)等。 ……如果加載失敗怎么辦?例如,這里沒有這樣的腳本(error 404)或者服務(wù)器宕機(不可用)。

發(fā)生在腳本加載期間的 error 會被 error 事件跟蹤到。

例如,我們請求一個不存在的腳本:

let script = document.createElement('script');
script.src = "https://example.com/404.js"; // 沒有這個腳本
document.head.append(script);

script.onerror = function() {
  alert("Error loading " + this.src); // Error loading https://example.com/404.js
};

請注意,在這里我們無法獲取更多 HTTP error 的詳細(xì)信息。我們不知道 error 是 404 還是 500 或者其他情況。只知道是加載失敗了。

  • 對于 <iframe> 來說,iframe 加載完成時會觸發(fā) iframe.onload 事件,無論是成功加載還是出現(xiàn) error。

1.5 特別說明sourceMap

在線上由于JS一般都是被壓縮或者打包(webpack)過,打包后的文件只有一行,因此報錯會出現(xiàn)第一行第5000列出現(xiàn)JS錯誤,給排查帶來困難。sourceMap存儲打包前的JS文件和打包后的JS文件之間一個映射關(guān)系,可以根據(jù)打包后的位置快速解析出對應(yīng)源文件的位置。

但是出于安全性考慮,線上設(shè)置sourceMap會存在不安全的問題,因為網(wǎng)站使用者可以輕易的看到網(wǎng)站源碼,此時可以設(shè)置.map文件只能通過公司內(nèi)網(wǎng)訪問降低隱患

sourceMap配置devtool: 'inline-source-map' 如果使用了uglifyjs-webpack-plugin 必須把 sourceMap設(shè)置為true https://doc.webpack-china.org...https://doc.webpack-china.org/guides/development/#%E4%BD%BF%E7%94%A8-source-map

三、vue的app.config.errorHandler全局處理函數(shù)

由于Vue會捕獲所有Vue單文件組件或者Vue.extend繼承的代碼,所以在Vue里面出現(xiàn)的錯誤,并不會直接被window.onerror捕獲,而是會拋給Vue.config.errorHandler。

app.config.errorHandler用于為應(yīng)用內(nèi)拋出的未捕獲錯誤指定一個全局處理函數(shù)。https://cn.vuejs.org/api/application.html#app-config-errorhandler

  • 詳細(xì)信息

  • 錯誤處理器接收三個參數(shù):錯誤對象、觸發(fā)該錯誤的組件實例和一個指出錯誤來源類型信息的字符串。

  • 它可以從下面這些來源中捕獲錯誤:

    • 組件渲染器

    • 事件處理器

    • 生命周期鉤子

    • setup() 函數(shù)

    • 偵聽器

    • 自定義指令鉤子

    • 過渡 (Transition) 鉤子

import { createApp } from 'vue'
import App from './App.vue'

let app = createApp(App)
app.config.errorHandler = (err, vm, info) => {
    console.log(123)
    // err:
    // vm:
    // info: 是vue特定的錯誤信息,比如錯誤所在的生命周期鉤子
    console.log(err, vm, info);
    fetch("http://127.0.0.1:8081/process_post", {
        method: "POST",
        headers: {
                "Content-Type": "application/json",
        },
        mode: "no-cors",
        body: JSON.stringify({
                errorMsg: err
        })
    }).then(function(res) {
        if (res.status === 200) {
                return res.json()
        } else {
                //return Promise.reject(res.json())
        }
    }).then(function(data) {
            console.log(data);
    }).catch(function(err) {
            console.log(err);
    });
}
app.mount('#app')

僅供參考,侵權(quán)必刪。文章來源地址http://www.zghlxwxcb.cn/news/detail-774807.html

到了這里,關(guān)于前端錯誤收集與處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • JavaScript 常見錯誤與異常處理

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

    2024年02月03日
    瀏覽(21)
  • 【JavaScript】1.5 錯誤處理和調(diào)試

    【JavaScript】1.5 錯誤處理和調(diào)試

    編程過程中,錯誤是無法避免的。而如何處理和調(diào)試錯誤,是每個開發(fā)者需要掌握的重要技能。在這一節(jié)中,我們將討論JavaScript中的錯誤處理和調(diào)試。 在JavaScript中,有幾種常見的錯誤類型: ReferenceError :當(dāng)試圖引用不存在的變量時,會拋出此錯誤。 TypeError :當(dāng)數(shù)據(jù)類型不

    2024年02月05日
    瀏覽(16)
  • JavaScript常見報錯及錯誤處理方法

    目錄 前言 一、報錯類型 1. SyntaxError(語法錯誤) 2. ReferenceError(引用錯誤) 3. TypeError(類型錯誤) 4. 其他錯誤類型 二、異常處理 try catch 1. try catch定義 2. try-catch塊的工作原理 3. try-catch基本語法 4. try-catch最佳實踐 在日常的前端開發(fā)中,都會遇到各種錯誤,所以錯誤處理是

    2024年02月06日
    瀏覽(37)
  • 使用try...catch語句優(yōu)雅地處理JavaScript錯誤

    使用try...catch語句優(yōu)雅地處理JavaScript錯誤

    ????? 個人主頁: 《愛蹦跶的大A阿》 ?? 當(dāng)前正在更新專欄: 《VUE》?、《JavaScript保姆級教程》、《krpano》、《krpano中文文檔》 ?? 目錄 ? 前言 ? 正文 簡介 語法 示例 錯誤對象 拋出錯誤 finally 語句 總結(jié) ? 結(jié)語 ? ? ????????JavaScript作為一門腳本語言,代碼運行時

    2024年01月22日
    瀏覽(22)
  • 前端面試題---跨域處理和異常、錯誤處理

    在前端開發(fā)中,當(dāng)我們在瀏覽器中向不同域名或端口發(fā)起請求時,就會遇到跨域請求的限制。為了處理跨域請求,有幾種常見的方法 ?1.JSONP(JSON with Padding) JSONP是一種利用 script 標(biāo)簽可以跨域加載的特性來實現(xiàn)跨域請求的方法。服務(wù)器端返回的數(shù)據(jù)會被包裹在一個JavaScript函

    2024年02月08日
    瀏覽(27)
  • 前端異常錯誤處理(包括但不限于react,vue)

    錯誤異常發(fā)生 頁面js報錯 請求報錯 頁面資源加載報錯 promise異常 iframe加載異常 頁面奔潰卡頓異常 處理異常的方法 1、react 自帶的errorBoundaries 2、 react 自定義Hooks 3、 vue errorHandler 4、try catch 對特定的代碼進(jìn)行捕獲 5、window.addEventListerner 6、window.onerror 7、 window.unhandledrejection 8、

    2024年02月16日
    瀏覽(22)
  • C# App.config和Web.config加密

    C# App.config和Web.config加密

    使用ASP.NET提供的命令工具aspnet_regiis來創(chuàng)建加密命令。 這個命令將加密App.config文件中的connectionStrings設(shè)置。C:MyAppFolder是應(yīng)用程序的根目錄。? 這個命令將會加密Web.config文件中的appSettings設(shè)置。? ?如果需要編輯加密的配置節(jié),可以使用aspnet_regiis提供的解密命令。 這個命令將

    2024年02月14日
    瀏覽(11)
  • 滲透測試 | APP信息收集

    滲透測試 | APP信息收集

    0x00 免責(zé)聲明 ????????本文僅限于學(xué)習(xí)討論與技術(shù)知識的分享,不得違反當(dāng)?shù)貒业姆煞ㄒ?guī)。對于傳播、利用文章中提供的信息而造成的任何直接或者間接的后果及損失,均由使用者本人負(fù)責(zé),本文作者不為此承擔(dān)任何責(zé)任,一旦造成后果請自行承擔(dān)! ???????? ??

    2024年01月17日
    瀏覽(19)
  • 在Winform中動態(tài)讀寫app.config文件

    在Winform中動態(tài)讀寫app.config文件

    https://blog.csdn.net/kingmax54212008/article/details/38987277?spm=1001.2101.3001.6650.7utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-38987277-blog-82746084.235%5Ev36%5Epc_relevant_default_base3depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-7-38987277-blog-8274

    2024年02月06日
    瀏覽(15)
  • JavaScript 日期和時間的格式化大匯總(收集)

    一、日期和時間的格式化 1、原生方法 1.1、使用 toLocaleString 方法 Date 對象有一個 toLocaleString 方法,該方法可以根據(jù)本地時間和地區(qū)設(shè)置格式化日期時間。例如: ? toLocaleString 方法接受兩個參數(shù),第一個參數(shù)是地區(qū)設(shè)置,第二個參數(shù)是選項,用于指定日期時間格式和時區(qū)信息

    2024年02月08日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包