В основном два случая, когда koa не может безопасно обрабатывать ошибки.
Метательных ошибки на различные клещах:
app.use(function*() {
setImmediate(function() {
throw new Error('boom')
})
})
ошибка эмиттера, которые не установлены как response.body=
:
app.use(function*() {
this.response.body = stream.pipe(zlib.createGzip())
})
Любой функция или библиотеку, которая делает первый случай имеет неверный формат, и не должно быть использованы. Если функция/библиотека использует обещания и/или обратные вызовы правильно, это никогда не произойдет.
Для эмиттеров, просто всегда устанавливается каждый поток в качестве тела (или использование промежуточного слоя):
app.use(function*() {
this.response.body = stream
this.response.body = this.response.body.pipe(zlib.createGzip())
})
Коа делает это, позволяя использовать попытаться/поймать на «асинхронным» вещи, а именно обратных вызовов и обещаний. Однако вы не можете попробовать/поймать ошибку, выброшенную на другой тик или эмиттер.