4か月前、node.jsの例外(非同期の例外、つまりイベントループによってトリガーされるコードによってスローされる例外を含む)を便利にキャッチする方法について書きました。 その記事では、標準のtry-catchブロックでは対応できないため、 コントロールブロックモジュールを使用してそれらを処理しました。
判明したように、ほぼ同時期に、Adam Crabtreeはtrycatchと呼ばれる制御ブロックのようなモジュールの安定バージョンをリリースしました。
trycatchモジュールは、制御ブロックにはない追加機能をいくつか提供します。
1. setTimeoutなどに渡されたコールバックをさらにラップする必要がなくなります。
これを行うために、trycatchモジュールは、起動時にsetTimeout、setInterval、fsモジュール関数を置き換えるので、コールバックを送信するときにBlock.guard()を常に呼び出す必要はありません。 これは自動的に行われます。
2.その結果、trycatchはサードパーティライブラリのサポートを提供します。
コールバックをラップする必要があるため、control-blockはサードパーティライブラリで発生した一部の非同期例外をキャッチできませんでした。
コントロールブロックモジュールに対しても強すぎる、このような不合理なサードパーティライブラリがあるとします。
function blackBox() { setTimeout(function() { throw new Error('black box error'); }, 10); }
これは、trycatchのおかげで安全に作業する方法を知っているコードです。
var trycatch = require('trycatch'); trycatch(function() { setInterval(blackBox, 1000); }, function(err) { console.log('caught!'); console.log(err.stack); });
彼は出力します:
3.長いスタックトレース
long-stack-tracesモジュールとの統合のおかげで、trycatchモジュールは、非同期例外を正しく追跡する長いスタックトレースを出力するように要求する場合、デバッグに役立ちます。
var trycatch = require('trycatch'); trycatch.configure({'long-stack-traces': true}); trycatch(function() { setInterval(blackBox, 1000); }, function(err) { console.log('caught!'); console.log(err.stack); });
このコードは既にそのようなスタックを出力します:
ちなみに、最近まで、長いスタックトレースのtrycatchプリコンパイルは必須でした。これは、control-blockに比べてパフォーマンスが約70〜100倍低くなりました。 著者とこの問題について話し合い 、可能な解決策を提案し、昨日彼は新しいバージョンをリリースしました 。これは現在、高速ブロックモジュールを提供するコントロールブロックモジュールに基づいています。 同時に、必要に応じて、たとえば開発が進行中で速度が重要ではないサーバー上で、長いスタックトレースを有効にする機会が残されています。 それは一種の共生をもたらし、それは両方のプロジェクトから最高のものだけを取りました。
私の意見でもtrycatchモジュールは完全ではないという事実にもかかわらず、私はこれが非同期例外を処理するための最良の解決策だと思います。