error.js
1.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
const ERROR_ID = []
function h5ErrorPage(message, error) {
if (error && !getIsReportId(error)) return
pageErrorTypePoint({ errorMessage: message })
errorBlock(
'./image/content_fail.svg',
'获取内容失败,请重试'
)
}
function getErrorId(val) {
return window.btoa(decodeURIComponent(encodeURIComponent(val)))
}
function getIsReportId(error) {
const id = getErrorId(error?.message || error?.fileName)
const even = item => item === id
if (ERROR_ID.some(even)) {
console.warn(`Duplicate error, not reported, ${error?.message}`)
return false
} else {
ERROR_ID.push(id)
return true
}
}
function handleJsError(type, ev, message) {
let stackFrame = ErrorStackParser.parse(ev)[0]
// 错误文件、行号、列号、源文件、堆栈等等
let { source } = stackFrame
const stack = `${type}: ` + message + ` ${trim(source)}`
return stack
}
window.onerror = function (message, source, lineno, colno, error) {
console.log(111)
const ev = handleJsError('window-onerror', error, error.message)
h5ErrorPage(ev, error)
}
window.addEventListener('error', function (error) {
const ev = handleJsError('addEventListener-error', error.error, error.message)
h5ErrorPage(ev, error)
})
window.addEventListener('unhandledrejection', function (e) {
e.preventDefault()
const ev = handleJsError('unhandledrejection-error', e.reason, e.reason.message)
h5ErrorPage(ev, e.reason)
// 唯一id判断
// const error = e.reason.stack
// const errorSource = extractParenthesesContent(error || '')
// const first = error ? error.split('\n')[0] : error
// h5ErrorPage(first + ` (${errorSource.map(el => `"${el}"`).join('、')})`)
return true
})