Javascript:“抛出未定义”是否安全?

Nic*_*uin 6 javascript error-handling

在下面的函数中,当条件失败时,我希望将这种情况作为简单错误进行处理(不需要详细信息)。只是出于好奇,这样写可以吗?安全吗throw undefined

function splitYearMonth (YM) { // Returns ["yyyy-mm", yyyy, mm]
  try {
    var o = YM.match(/^(\d{4})\-(0[1-9]|1[012])$/);
    if (o != null) {
      return  [o[0], parseInt(o[1], 10), parseInt(o[2], 10)];
    } else {
      throw undefined;
    }
  } catch (e) {
    return [undefined, undefined, undefined];
  }
}
Run Code Online (Sandbox Code Playgroud)

Fré*_*idi 6

是的,这样做是安全的。

ECMAScript 5.1 规范指出

产生式ThrowStatementthrow [no LineTerminator here] Expression ;评价如下:

  1. exprRef为计算Expression的结果。
  2. 返回(抛出,GetValue(exprRef),空)。

ECMAScript 6使用相同的术语

undefined肯定是一个表达式,所以可以抛出它。你可以在这个小提琴中看到一个例子。

也就是说,undefined从可维护性的角度来看,抛出可能不是一个好主意,因为这样做会让您根本无法获得有关异常原因的任何信息。扔一根绳子可以说是一个更好的解决方案:

var o = YM.match(/^(\d{4})\-(0[1-9]|1[012])$/);
if (o != null) {
    return [o[0], parseInt(o[1], 10), parseInt(o[2], 10)];
} else {
    throw "unrecognized date format";
}
Run Code Online (Sandbox Code Playgroud)

更新:再想一想,除非您的问题中不需要详细信息子句意味着您没有告诉我们整个故事,否则您只需要控制流,而不需要异常处理。你只需要写:

function splitYearMonth(YM) {  // Returns ["yyyy-mm", yyyy, mm]
    var o = YM.match(/^(\d{4})\-(0[1-9]|1[012])$/);
    if (o != null) {
        return [o[0], parseInt(o[1], 10), parseInt(o[2], 10)];
    } else {
        return [undefined, undefined, undefined];
    }
}
Run Code Online (Sandbox Code Playgroud)

异常处理的成本可能很高,并且通常不建议使用此工具来控制流(因为我们讨论的是 Javascript,而不是 Python)。