Nodejs APIの状態...
JavaScript で throw がどのように機能するかという性質上、参照を漏らしたり、他の種類の未定義の脆弱な状態を作成したりせずに、安全に「中断したところから再開する」方法はほとんどありません。
ただし、Koa はエラーをトラップし、nodejs プロセスの終了を回避します。Koa がこのアドバイスを安全に無視できる理由は何ですか?
Nodejs APIの状態...
JavaScript で throw がどのように機能するかという性質上、参照を漏らしたり、他の種類の未定義の脆弱な状態を作成したりせずに、安全に「中断したところから再開する」方法はほとんどありません。
ただし、Koa はエラーをトラップし、nodejs プロセスの終了を回避します。Koa がこのアドバイスを安全に無視できる理由は何ですか?
koa がエラーを安全に処理できない主なケースは 2 つあります。
異なるティックでスローされるエラー:
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())
})
Koa は、「非同期」のもの、特にコールバックとプロミスで try/catch を使用できるようにすることでこれを行います。ただし、別のティックまたはエミッターでスローされたエラーを試行/キャッチすることはできません。