【问题标题】:Should my JavaScript API throw or return a value on invalid inputs?我的 JavaScript API 是否应该在无效输入上抛出或返回值?
【发布时间】:2016-11-04 22:27:27
【问题描述】:

假设我正在开发一个导出 clamp() 函数的 JavaScript 库, 将数字限制在给定范围内。

export function clamp(n, min, max) {
  return Math.min(Math.max(n, min), max);
}

但是如果min 大于max,这个函数就会失败。有两种解决方案 这似乎是明智的。

首先,函数可以返回NaN

export function clamp(n, min, max) {
  return min <= max ? Math.min(Math.max(n, min), max) : NaN;
}

其次,函数可能会抛出异常:

export function clamp(n, min, max) {
  if (min > max) {
    throw new RangeError('min may not be greater than max');
  }

  return Math.min(Math.max(n, min), max);
}

在这种情况下,哪种解决方案最好?

我会尝试回答我自己的问题,但我肯定会接受一个更好的 一个。

【问题讨论】:

    标签: javascript error-handling


    【解决方案1】:

    这里需要考虑三个问题:如果用户期望一些输入怎么办 无效?如果无效输入是无意的怎么办?和什么模式 语言中常见吗?

    当预期输入无效时

    用户可能期望某些输入无效。如果函数返回NaN,这些情况就很容易处理了。

    let values = [[2, 4, 6], [3, 5, 1], [7, 5, 9]];
    
    let clamped = values.map(args => clamp(...args)).filter(n => !isNaN(n));
    
    console.log(clamped); // [4, 7]
    

    如果函数要抛出异常,用户将不得不使用 try...catch statement,这将更冗长且性能更低。或者她 可以在应用clamp() 之前过滤掉无效的输入,但随后她 必须确切知道哪些类型的输入是无效的,这可能是 比这个例子更复杂。

    这显然是支持NaN 选项的一点。

    当无意输入无效时

    如果使用该功能,部分用户的真正错误将更容易调试 抛出异常。例如,用户很容易犯错误,例如 这个:

    clamp(-4, 0, -10);
    

    如果上面返回NaN,调试可能是噩梦,尤其是在 一个庞大的代码库,还有很多其他的事情正在发生。如果函数是 抛出异常,用户会看到:

    RangeError: min may not be greater than max
      at clamp ...
    

    简单得多。这显然是throw 的胜利。

    常用语言模式

    所以我们打成平手。我们最好的选择是问自己,WWJD(JavaScript 会怎样? 做)?例如,当我们将负数传递给 Math.sqrt() 时会发生什么?

    console.log(Math.sqrt(-4)); // NaN
    

    它返回NaN。这是决胜局。 JavaScript 程序员会期望 如果输入无效,此类函数将返回 NaN。他们会 习惯于处理源自此行为的错误,或者如果不是, 那么他们最好习惯它。

    所以返回NaN

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 2018-04-28
      • 2020-04-02
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 2014-03-20
      相关资源
      最近更新 更多