Почему ваша обработка ошибок не работает?

Ошибка не будет обнаружена, если ошибка возникает внутри метода then асинхронной функции. Блок try catch выполняется до выполнения асинхронной функции (да! обработка ошибок в JS синхронна), но ошибка возникает в более поздний момент времени, когда эта асинхронная функция выполняется

try{
anAsyncFunction().then(
//do something which can throw an error
)
}catch(e){
}

//in this case error will not be caught because of the reason stated above
Codepen link: https://codepen.io/arnavsingh/pen/MWKLRjP?editors=0010

Откройте режим проверки в Codepen, консоль будет иметь неперехваченную ошибку

Решения

Использовать необработанное событие отклонения

window.addEventListener('unhandledrejection', function(event) {
})

or

Используйте обратные вызовы вместо асинхронной функции

or

Используйте асинхронную обработку ошибок

anAsyncFunction.then(errorProneFunction).catch(error=>{})

or

Использовать множественный захват

let anAsyncFunction = async()=>{ return null}
try{
  
anAsyncFunction().then(()=>{
  
  try{
    throw 'shit happens'
  }catch(e){
    document.body.innerHTML = e
  }
  
})
  
}catch(e){
  document.innerHTML = e
}
Codepen link: https://codepen.io/arnavsingh/pen/MWKLRjP?editors=0010

На этот раз неотловленной ошибки не будет.

Вам не нужно бросать объект ошибки

Обычно мы хотим извлечь сообщение об ошибке в блоке catch с помощью этого

try{
throw Error('shit happens')
}catch(e){
console.log(e.message) // it will console log "shit happens"
}

throw Error создает объект ошибки, который содержит строку, в которой возникла эта ошибка, и сообщение, но если вы хотите использовать только сообщение об ошибке, вы можете вместо этого выбросить только сообщение.

да! это возможно.

try{
throw 'shit happens'
}catch(e){
console.log(e) // it will console log "shit happens"
}
similarly you can throw objects constants arrays any JS object

но вы не сможете узнать, что ошибка линии возникла из-за