2016-09-22 2 views
0

URLのリストをループし、needleを使用してそれらをフェッチするコードがあります。URLの1つが不正な形の場合、問題が発生しています。 URIError実行を停止します。try-catchブロック内でも実行を中止した例外

私がしたいことは、ループがこのようになりますマークされるのは悪いURLのためですが、ループが続く、私はtry-catchブロックが含まれ、次のコードを持っていますが、それはまだ

URIError: URI malformed 
    at decodeURIComponent (native) 
    at parseSetCookieString (node_modules/needle/lib/cookies.js:44:35) 
    at node_modules/needle/lib/cookies.js:54:18 
    at Array.reduce (native) 
    at Object.parseSetCookieHeader [as read] (node_modules/needle/lib/cookies.js:53:17) 
    at ClientRequest.<anonymous> (node_modules/needle/lib/needle.js:418:30) 
    at ClientRequest.g (events.js:199:16) 
    at ClientRequest.emit (events.js:107:17) 
    at HTTPParser.parserOnIncomingClient [as onIncoming] (_http_client.js:426:21) 
    at HTTPParser.parserOnHeadersComplete (_http_common.js:111:23) 

エラーをスローします

for (var i =0; i < items.length; i++) 
    { 
    var url = items[i].link; 
    var options = {}; 
    (function(inner_url){ 
     try { 
     needle.get(inner_url, options, function(err, res) { 
      if(err) { 
      console.log(err) 
      } else { 
      console.log('success') 
      } 
     }) 
     } catch (URIError) { 
     console.log(URIError) 
     } 
    })(url) 
    } 

ありがとう

答えて

1

非同期コードを使用すると、try/catchは役に立ちません。

try {var a = a.b.c.d.s}catch(e){}例えば

は動作します。

しかし、try{requestToSomeURL or any async operation}catch(e){}はそうではありません。

この理由は、このコードを使って非同期のJavaScriptを実行して(コンテキストが失われた)、次のページに移動するためです。イベントループがコールバック関数をトリガすると、例外を取得して表示します。

これを修正するには、 needle.getメソッドにエラー処理を追加する必要があります。その場合、コールバック関数はすべてのエラーを渡します。

これがサードパーティライブラリの場合は、GET操作を行う前にURLを確認する必要があります。詳細

http://ruben.verborgh.org/blog/2012/12/31/asynchronous-error-handling-in-javascript/

Should async function never ever throw?

のためにも、この答え

チェックはこの情報がお役に立てば幸いです。

+0

答えをいただきありがとうございます、残念ながら、針は私が維持していない第三者のモジュールです。 – Haddad

+0

でも、私が言及したように、要求を行う前にあなたのURLを確認してください。 URLにいくつかの悪い値がある場合は、リクエストしないでください。これにより、この種の問題を防ぐことができます。 –

関連する問題