Почему ваша обработка ошибок не работает?
Ошибка не будет обнаружена, если ошибка возникает внутри метода 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
но вы не сможете узнать, что ошибка линии возникла из-за