甚至在try-catch块

时间:2016-09-22 09:32:43

标签: node.js needle.js

我有一些代码循环遍历URL列表并使用needle获取它们,我遇到了问题,因为似乎其中一个URL格式不正确会引发 URIError 停止执行。

我想要的是标记错误的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 个答案:

答案 0 :(得分: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?

希望这有帮助。