【问题标题】:try-catch returns variable as undefinedtry-catch 将变量返回为未定义
【发布时间】:2015-11-30 06:36:05
【问题描述】:

假设两次尝试都失败,url 返回未定义,console.log 在这种情况下不会执行。我的 try-catch 子句堆叠有问题,还是 url 变量的范围有问题?

我正在使用 try-catch,因为在我的上下文 url1,2 中,默认值可能不可用。

getURL = function()
{
   var url;
      try{
        url=data.url1;
      }
      catch(err1)
      {
        try{
          url=data.url2;
        }
        catch(err2)
        {
          console.log("Fetching default url");
          url=data.defaulturl;
        }
      }
      finally
      {
        //do something with url
      }
}

我尝试使用 if-else-if 结构,但如果 data.url 1/2/default 不可用,则会返回错误。

if('String' === typeof data.url1)
{
}
else if(check for url 2/default etc.){...}

【问题讨论】:

  • 如果data 对象中没有urlurl2 属性,则分配不会引发异常,因此您的代码无法按预期工作。在您的情况下使用 try/catch 也很难阅读。您应该坚持测试数据对象的值(以及数据对象本身 - 如果 data 未定义,data.url 确实会抛出)。
  • 您的问题不清楚。你如何处理backurldata 来自哪里,data 也可能未定义(可能)?
  • 可能听起来很傻,但是你忘了return 任何东西,所以函数总是返回未定义的。要让它返回url 的值,你需要有这样一行:`return url;".
  • 另外,在第二个捕获中,您将值分配给不同的变量“backurl”,因此即使您返回url,也不会返回正确的值。
  • getURL函数的作用是什么?以特定顺序检查某些属性的存在并返回第一个匹配的?或者会有一些加载代码? backurl 的目的是什么?

标签: javascript try-catch


【解决方案1】:

我最后一次尝试重新发明这个问题...但是如果所有键都未定义或 URL 加载不成功,则根本没有成功。

getURL = function() {
  var localData = data || {};
  var keys = ['url1', 'url2', 'defaulturl'];
  var success = false;
  var currentKey;
  while (!success && keys.length > 0) {
    currentKey = keys.shift();
    if (localData.hasOwnProperty(currentKey)
      && 'string' === typeof localData[currentKey]) {
      try {
        url = localData[currentKey];

        // Url loading code may throws an exception,
        // or you can throw it below by hands if needed

        // Emulate loading result...
        if (Math.random() > .5) {
          throw 'Error in ' + localData[currentKey] + ' loading';
        }

        success = true;
      } catch(exception) {
        // Logging or something else here
        console.log(exception.toString());
      }
    }
  }
}

【讨论】:

  • 我正在使用 try catch,因为某些 url 可能不可用(data.urlx 可能未定义)或可能发生其他一些与 URL 相关的错误。我将添加我在问题中提到的内容。如果我想检查一些东西,那么我想检查 data.urlx 是否是一个字符串(或不是未定义的)。 “数据”始终是一个对象。
  • 我的答案已更改。
  • 就我而言,defaulturl 不应该与其他密钥分开,但所有者更了解他的生态系统。
  • !(currentKey = keys.shift()) 当键中没有更多元素要删除时返回true?你是故意写!!吗?
  • 您的回答通过使用 .hasOwnProperty 而不是 try-cath 语句帮助我解决了我的问题。谢谢!
猜你喜欢
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2012-01-16
  • 2020-11-29
相关资源
最近更新 更多