【问题标题】:Is try / catch (one of) the best ways to keep errors from occuring if a variable is undefined?如果变量未定义,try / catch(其中之一)是防止错误发生的最佳方法吗?
【发布时间】:2011-08-05 02:31:51
【问题描述】:

有人警告我,这篇文章可能过于主观,但我只编程了几个星期,所以我想知道。

到目前为止,我一直在我的 JS 中使用 try/catch 语句来防止在运行函数时未定义变量的情况下引发错误,但这是唯一有效的方法吗?

【问题讨论】:

  • 最好弄清楚错误发生的原因。然后阻止错误发生。随着代码的增长,您会产生很多麻烦。
  • 您可能应该尝试编写您的代码,以便您确信在使用它之前定义了一个变量,但如果您不能,那么可能比 try/catch 更好的选择是检查如果变量存在,例如if (x) { }if (typeof(x) != "undefined") { }
  • undefined 是变量具有的有效值,而不是自动错误条件。像其他人建议的那样使用if 声明。我不知道我是否会使用“从不”这个词,但我会说使用try/catch 用于此目的几乎绝不是一个好主意。即使除了执行速度问题(您可能关心也可能不关心)try/catch 合并到您的代码中要笨重得多。

标签: javascript methods methodology


【解决方案1】:

如果您在浏览器中,可以使用window.foo 测试全局变量。例如:

if (window.foo === undefined)
    console.log("foo is not defined");

如果我正在阅读代码,我更愿意阅读本文而不是 try { foo } catch { … }

另外,请注意三等号:这是必要的,因为如果window.foonull,那么window.foo == undefined 将是true,而window.foo === undefined 将是false(你想要的)。

【讨论】:

  • 当变量不存在时仍然会产生错误。所以它不能达到我想要的目的。
  • 如果我写if (cowbell === undefined) { alert ("cow") },Firebug 会提示“牛铃未定义”,而 Firefox 不会显示“牛”警告。 Safari 的行为类似。它的控制台显示“ReferenceError:找不到变量:cowbell”。这就是为什么我同意乔的建议。无论变量是否存在,它都是迄今为止执行的版本。
  • 那是因为cowbell 没有定义。但是,如果您使用 window.cowbell,正如我在回答中所建议的那样,您将获得预期的结果。
【解决方案2】:

要测试是否存在常规变量,我想说最好的办法是将类型与未定义进行比较,例如:

if (typeof(x) != "undefined") {
    // your variable exists
}

【讨论】:

  • 这是迄今为止发布的唯一在变量不存在时不会引发错误的方法。谢谢,乔。
【解决方案3】:

就个人而言,如果有更简单的解决方案,我会尽量避免使用 try/catch 语句。

在您的情况下,JS 和其他所有语言都提供了一种更简单的方法来查看是否定义了变量。

if (window.x === undefined)

或者如果变量是使用 var x 定义的:

if (x === undefined)

【讨论】:

  • 当变量不存在时仍然会产生错误。所以它不能达到我想要的目的。
【解决方案4】:

在那种情况下我不会使用 try/catch。如果它抱怨一个变量未定义,我会寻找错误所在并修复它。

【讨论】:

    【解决方案5】:

    通常,异常用于通知应用程序不满足程序员所做的假设。例如 - 网络连接不工作、文件不存在、安全不允许某些事情等等。

    如果您知道某些变量可能未定义,那么您不应该使用异常,而是在 if 中处理它。或者尽可能遵循策略来获得有意义的对象或价值。

    【讨论】:

      【解决方案6】:

      检查变量是否使用 if 语句定义

      实际上 try catch 是一种非常低效的测试变量是否未定义的方法。最好的方法是检查变量是否在 if 语句中定义。

      if(!someVariable === undefined){
        // Do Logic Here that requires someVariable to be defined
      }
      

      【讨论】:

      • 当变量不存在时仍然会产生错误。所以它不能达到我想要的目的。
      猜你喜欢
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多