0

最近はES6 Promisesを多用しています。onRejectedそのため、関数を指定しないと、例外を追跡できなくなります。

new Promise(function(resolve, reject) {
  resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
  return performDangerousTranformation(result);
});

catch()を使用して数バイトを追加して、例外がコンソールに表示されるようにすることができれば、非常に便利です。

new Promise(function(resolve, reject) {
  resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
  return performDangerousTranformation(result);
}).catch(console.error);

console.error残念ながら、関数ではなくメソッドであるため、これは機能しません。つまり、consoleを呼び出すときにレシーバー を指定する必要がありますconsole.error()。これは、ブラウザ コンソールで簡単に確認できます。

> console.error('err');
prints err
> var f = console.error;
> f('err');
throws Illegal invocation exception

これは、私のcatch()ハンドラーを追加することはもう少し冗長であることを意味します:

new Promise(function(resolve, reject) {
  resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
  return performDangerousTranformation(result);
}).catch(function(error) { console.error(error); });

確かに、ES6 では少し改善されています。

new Promise(function(resolve, reject) {
  resolve(doCrazyThingThatMightThrowAnException());
}).then(function(result) {
  return performDangerousTranformation(result);
}).catch((error) => console.error(error));

ただし、余分な入力は避けたほうがよいでしょう。さらに悪いことに、catch(console.error)今日使用すると、例外が黙って無視されます。これは、まさに解決しようとしている問題です! console.error()メソッドである必要がある仕組みの基本的なものはありますか?

4

2 に答える 2

1

Node: https://github.com/nodejs/node/commit/025f53c306d91968b292051404aebb8bf2adb458でこの動作が変更されたようです。

于 2017-08-03T21:27:09.870 に答える