【问题标题】:Exception stopping execution even inside a try-catch block即使在 try-catch 块内,异常也会停止执行
【发布时间】:2017-01-30 19:28:55
【问题描述】:

我有一些代码循环遍历 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)
  }

任何指针?

谢谢

【问题讨论】:

    标签: node.js needle.js


    【解决方案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?

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回答,不幸的是,needle 是我没有维护的第三方模块。不过可能会向开发人员提出问题
    • 那么正如我所提到的......请在请求之前检查您的 URL。如果 URL 有一些错误的值,请不要请求。这将防止此类问题。
    猜你喜欢
    • 1970-01-01
    • 2021-11-17
    • 2014-08-28
    • 2020-12-11
    • 1970-01-01
    • 2023-01-25
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多