error.js 1.67 KB
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
})