2017-11-07 18 views
1

以下のサンプルコードでtry ... catchが機能しないのはなぜですか?試してみてください...非同期でキャッチエラーをキャッチしないでください

const http2 = require("http2") 
const url = require("url") 


function sendRequest() { 
    return new Promise((resolve, reject) => { 

     var r = http2.request({ 
      "host": "www.google.com", 
      "method": "GET", 
      "path": "/" 
     }, (resp) => { 
      var data = [] 
      resp.on("data", (chunk) => { 
       throw ("Error") 
      }) 
      resp.on("end",() => { 
       console.log("ended") 
       resolve("finished") 
      }) 
      resp.on("error", (e) => { 
       console.log("error") 
       reject(e) 
      }) 
     }) 
     r.end() 
    }) 
} 

async function wrapper(){ 
    try { 
     console.log("Sending request") 
     await sendRequest() 
     console.log("Finished sending Request") 
    }catch(e){ 
     console.log("error!") // Supposed to see this 
     console.log(e) 
    } 
    console.log("All finished") // Supposed to see this 
} 

wrapper() 

出力は以下の通りである:

Sending request 

/Users/test-user/test.js:15 
       throw ("Error") 
       ^
Error 

Process finished with exit code 1 
+6

で正常に動作ここでは、あなたの約束です。拒否を呼び出す代わりに、あなたがエラーを投げます。 – Keith

+0

最初に 'data'がエラーになるのはなぜですか? –

答えて

0

throwのみasync機能に約束拒否に変換されるため、約束の実行者の同期部分(あなたがnew Promiseを渡すコールバック)、 同期部分のthenまたはcatchコールバックです。非asyncコールバックで実行していますが、これはこれらの場所ではありません。

throw ("Error");は(まあ、実際にそれがreject(new Error("Error"));   —拒否がエラーなので、new Errorを使用するなど、あなたのスタックトレースを与えるべきである)reject("Error");でなければなりません。


サイドノート:通常、dataイベントを受け取るには、どのような場合にエラーではないでしょう...

サイドノート2:throw ("Error");()は何もしません。スローがオプションの場合は、単にthrow "Error";(または、やはりthrow new Error("Error");)です。

+0

チャンクでエラーが発生していても、それほど変わっていない可能性があります。たとえば、ファイルをダウンロードしてZIPを受け取ると予想される場合は、最初の数チャンクでマジックコードを確認してから、中止して約束を破棄することができます。あなたの後ではないものをダウンロードして保存します。 – Keith

+0

@Keith:そうです。しかし問題のコードは無条件です。 –

+0

私は質問のコードは本物ではないと思う.. :) – Keith

0

でエラーをキャッチすることができますが、そのエラーが約束自体であり、別の非同期コールバックではない限り、エラーをキャッチすることができます。例えば

、予想通りtest()作品が、test2()しません:

function test(){ 
 
    return new Promise((resolve, reject) => { 
 
     throw (new Error("error")) 
 
    }) 
 
} 
 

 
function test2(){ 
 
    return new Promise((resolve, reject) => { 
 
     setTimeout(() => { 
 
      throw (new Error("error")) 
 
     }, 100) 
 

 
    }) 
 
} 
 
async function go(){ 
 
    try { 
 
     await test() 
 
    } catch(err){ 
 
     console.log("caught error from test(): ", err.message) 
 
    } 
 

 
    try { 
 
     await test2() 
 
    } catch(err){ 
 
     console.log("caught error from test2(): ", err.message) 
 
    } 
 

 
} 
 
go()

いずれの場合もそれが問題だのawaitではありませんreject()代わりのthrow()

関連する問題