なぜ最初のパラメータですか?
Node.jsは非同期の性質を持つため、first-parameter-as-errパターンはユーザーランドのNode.jsエラー処理の規約として確立されています。これは非同期だからです:
try {
setTimeout(function() {
throw 'something broke' //Some random error
}, 5)
}
catch(e) {
//Will never get caught
}
したがって、コールバックの最初の引数を持つことは、エラーをスローする以外に、非同期でエラーを渡す唯一の賢明な方法です。
そうすることは unhandled exception
それが聞こえるように、アプリケーションを混乱状態から抜け出すために何も行われなかったことを意味します。
例外、なぜ存在するのか
ただし、Node.jsの実質的にすべての部分がイベントエミッタであり、例外のスローがすべてのイベントと同様に処理できる低レベルのイベントであることは注目に値します。
//This won't immediately crash if connection fails
var socket = require("net").createConnection(5000);
socket.on("error", function(err) {
console.error("calm down...", err)
});
これは、すべてのエラーをキャッチするために極端にすることはできませんが、すべきではありません。クラッシュしないように一生懸命試みるアプリケーションを作成するためにすることはできませんが、すべきではありません。これは、ほとんどすべてのユースケースでひどい考えです。これは、アプリケーションの状態で何が起こっているのかまったくわからないままになり、mainをtry-catchでラップすることに似ているためです。
ドメイン-イベントを論理的にグループ化
アプリケーションがフォールオーバーする例外のこの問題への対処の一環として、ドメインを使用すると、開発者は、たとえばExpress.jsアプリケーションを取得して、致命的な障害が発生した場合に接続を意図的に切断することができます。
ES6
ES6ではジェネレーターパターンで非同期イベントを作成できるため、これが再度変更され、try / catchブロックで引き続きキャッチできることについて言及している可能性があります。
Koa(Express.jsの同じ原作者であるTJ Holowaychuckによって書かれた)はこれを顕著に行います。ES6 yield
ステートメントを使用して、ほとんど同期しているように見えながら、通常のノード非同期方式で処理されるブロックを作成します。
app.use(function *(next) {
try {
yield next;
}
catch (err) {
this.status = err.status || 500;
this.body = err.message;
this.app.emit('error', err, this);
}
});
app.use(function *(next) {
throw new Error('some error');
})
この例はここから恥知らずに盗まれました。