ノードを数か月使用しています。非同期コードでのエラー処理については、私が認識しているベスト プラクティスに従っています。これは、コールバック エラー引数を介してエラーを処理し、ほとんどの例外が発生してアプリをクラッシュさせることです。きれいに回復する方法。
私は現在、Qを使用する開発者と一緒にプロジェクトに取り組んでおり、彼は Q.nfbind を使用するラッパーで私のコールバック ベースの関数のいくつかを呼び出しています。ただし、これにより、エラー処理が頭を悩ませています。たとえば、エラーでコールバックできる関数があるとします。
function doSomething(x, callback) {
dbpool.acquire(function(err, conn) {
if (err) return callback(err);
conn.query('INSERT INTO some_table (x) VALUES (?)', [x],
function(err, result) {
dbpool.release(conn);
if (err) return callback(err);
callback(null, result.insertId);
});
}
var qDoSomething = Q.nfbind(doSomething);
QI を使用すると、qDoSomething を呼び出して、エラーを正常に処理できます。
qDoSomething('abc')
.fail(function(err) {
...
});
ここで、ある夜遅くまで仕事をしていて、クエリの直前に doSomething() 関数内で次のようなコードをチェックインしたとします。
var foo;
foo.doAnotherThing();
私のプレQの世界では、これは悪いことです。例外がスローされ、アプリがクラッシュし、永遠に再起動されます。ただし、アプリを再起動すると、少なくともこのコード パスが再びヒットするまで機能します。ただし、Q では、この例外がキャッチされ、fail ハンドラによって処理されるようになりました。このハンドラーは、接続プールについて何も知らないため、損傷を修復できません。現在、このコード パスがヒットするたびに、プールから接続がリークされ、最終的にアプリがブリックされます。このバグの影響は、ひどいものからひどいものになりました。
Q で、最初にスローされたエラーとコールバック エラーによって発生したエラーを区別する方法がわかりません。すべてを処理するか、何も処理しないかで行き詰まっているようです。ひどい状態から悪い状態に戻る方法を誰か提案できますか?