0

私はそこに答えがあることを知っていますが、私は実際の質問に特定の答えを見つけることができませんでした。非同期 - 約束されていないエラーを取得するにはどうすればよいですか? (その特定のエラーに反応する)

現在、私は次のパターンをたくさんuse

class A 
{ 
    getLocation() 
    { 
     return Promise.reject(2222222) 
    } 
    async a() 
    { 
     try 
     { 
      var loc = await this.getLocation(); 
      alert(loc) 
     } 
     catch (e) 
     { 
      alert("catch 2") 
     } 
    } 
} 
new A().a(); 
  • 結果:私はgetLocationにエラーをスローした場合、 "キャッチ2"

イベント:

getLocation() 
    { 
     throw Error("ffffff") 
    } 

- 同じ結果が得られます。これは問題ありません。

どこに問題がありますか?

まあ、あなたが知っているように、asynchronously-non-promisedスローされるエラーが異なる獣です:

全くそうthis code won't be catched

getLocation() //bad code from a third party code , third party code 
    { 
     return new Promise((v, x) => setTimeout(() => 
     { 
      throw Error("ffffff") 
     }, 100)) 
    } 

質問:そのI事実について

エラーをキャッチしたい - これをキャプチャするためのより良いパターンはありますか?

私にできることを確認します。

window.onerror = function() { alert(4)} 

しかし、それは.catch(...)またはcatch(){}の流れとして順ではないだろう、と私はエラーの原因となったその具体的な行動に関する行為を行うことはできません。

全開示:
実際のシナリオはありません。学習目的。

答えて

2

非同期非約束したスローされるエラーは、はい

異なる獣です。そして、それは絶対に避けなければなりません。したがって、は決してビジネスコード(プロパティアクセスのような小さなものを含む)を非同期非約定コールバックに入れます。それは投げることができる! 「オブジェクト」がnullまたはundefinedであるかゲッターが関与しているときにプロパティアクセスがスローされる可能性があること、または配列であると思われるものが.lengthでないときにループが失敗する可能性があることは明らかです。

非同期非約束のコールバックがresolvereject、および(err, res) => { if (err) reject(err); else resolve(res); }ある(そしておそらく複数の引数を持つ奇妙なAPIの可変引数バージョン)として許可されている唯一のもの。

ので

async getLocation() { 
    await new Promise(resolve => setTimeout(resolve, 100)); 
    throw Error("ffffff"); 
} 

または

getLocation() { 
    return new Promise(resolve => setTimeout(resolve, 100)).then(res => { 
     throw Error("ffffff"); 
    }); 
} 

に悪いコードを書き換えると、それは、サードパーティのコードだとき彼らはそれを修正します、あなたの修正の上流マージ要求を行う、またはそれらのドン場合その仕事を放棄することはありません。

これをキャプチャするためのパターンがありますか?

(ノード内)

まあ、domainsは、非同期の非局所性(キャッチされない)例外が、they didn't work outのこの問題を解決することになっていました。おそらくいつか、より良い母国語のサポートとzonesは、それらを置き換えます。

0

エラーは、発生した場所で捕捉される必要があります。

コードコードのこの種のは間違っているとその場で固定する必要があります。

getLocation() //bad code from a third party code 
    { 
     return new Promise((v, x) => setTimeout(() => 
     { 
      throw Error("ffffff") 
     }, 100)) 
    } 

これは、サードパーティのコードであれば、それはフォークやパッチを適用することができます。

質問はすでに言及しているように、例外はグローバルにonerrorで追跡できます。これは、既存のエラーを通常の方法で処理するのではなく、開発者に通知するためにのみ使用してください。

unhandledrejectionイベントは、約束事の未処理の拒否について通知するために同じ目的で使用できます。これは、setTimeoutコールバックの内部にスローされ、約束の拒否をもたらさないため、上記で取り上げたエラーを処理することができません。私は基本的な使用法は、このようなものだと思い

0

Promiseの拒否は、必ずしもコードExceptionだけでなく、コードExceptionない

class A { 
 
    getLocation(x) { 
 
    return new Promise((resolve, reject) => setTimeout(() => { 
 
     // a lot of async code 
 
     try { 
 
     //simulate unexpected exception  
 
     if (x === 2) { 
 
      throw ("code error"); 
 
     } 
 
     if (x) { 
 
      resolve('success'); 
 
     } else { 
 
      reject('conditional rejection'); 
 
     } 
 
     } catch (ex) { 
 
     reject(ex); 
 
     } 
 
    }, 1000)); 
 
    } 
 
    async a(x) { 
 
    await this.getLocation(x).then((loc) => console.info(loc)).catch((e) => console.error(e)); 
 
    } 
 
} 
 
let o = new A(); 
 
o.a(2); 
 
o.a(0); 
 
o.a(1);

は必ずしもPromiseをトリガーするべきではありません拒絶。

関連する問題