JavaScript错误处理:我可以在三元运算符中抛出错误吗?

时间:2012-02-21 00:44:42

标签: javascript error-handling

我是否允许在三元运算符中抛出错误?这是有效的吗?

function foo(params) {

    var msg = (params.msg) ? params.msg : (throw "error");

    // do stuff if everything inside `params` is defined
}

我要做的是确保定义param对象中所需的所有参数,如果未定义任何参数,则抛出错误。

如果这只是愚蠢的,有没有更好的方法来做到这一点?

9 个答案:

答案 0 :(得分:29)

你可以这样做:

function foo(params) {

    var msg = (params.msg) ? params.msg : (function(){throw "error"}());

    // do stuff if everything inside `params` is defined
}

我不会真的推荐它,它会产生无法读取的代码。

这也可行(不是说它真的好多了):

function foo(params) {

    var msg = params.msg || (function(){throw "error"}());

    // do stuff if everything inside `params` is defined
}

或者为了更清洁的方法,创建一个命名函数。

function _throw(m) { throw m; }
function foo(params) {

    var msg = params.msg || _throw("error");

    // do stuff if everything inside `params` is defined
}

答案 1 :(得分:7)

不,绝对不允许。 throw是一个陈述,它不能成为表达式的一部分。

不幸的是,我认为这是唯一的方法。您可以在没有大括号的情况下使用if

if(!params.msg) throw new Error("msg is required!");

但是我知道没有任何好的,简单的解决方法。

答案 2 :(得分:2)

这是一个从三元组中抛出的简单小技巧。我只是在未定义的符号上调用一个不存在的,不可能存在的属性。我只检查了chrome,它可以被捕获并重新抛出,如果你需要它有一个适当的错误消息,但这是不必要的膨胀

try {
  var msg = (params.msg) ? params.msg : (void 0).throwError()
}
catch(e) {
  throw new Error('Params has no msg property')
}

答案 3 :(得分:2)

这是一种更干净的方法,对我有用:

const msg = params.msg ? params.msg : ((function () { throw new Error('Message not found); }()));

答案 4 :(得分:1)

构建@ dagg的方法和named function示例;这是相同但使用ES6的默认参数:



function _throw(m) { throw new Error(m); }

function foo({ msg = _throw('msg parameter not defined') } = {}) {
  console.log(msg);
}

foo({ msg : 'party people!' }); // :D
foo({}); // throws!




答案 5 :(得分:1)

你可以在三元运算符中抛出这样的错误,

function isPositive(a) {
    if(a > 0)
        return "YES";
    throw a == 0 ? Error("Zero Error") : Error("Negative Error");
}

答案 6 :(得分:0)

使用fetch时遇到此问题,这是我为该特定案例提供的解决方案:

return fetch(url, request)
  .then(response => response.status >= 400 && response.status < 600 
    ? response.json().then(error => {throw new Error(error.message)})
    : response);

注意throw周围的(内联)块,它将箭头函数体从(返回)表达式转换为语句。

答案 7 :(得分:0)

建立在@daggs上的答案可能是更简洁的方法

function foo(params) {

   var err = function () {
    throw "error";
  };

    var msg = (params.msg) ? params.msg : err();

    // do stuff if everything inside `params` is defined
}

答案 8 :(得分:0)

这是不可能的,您不应为此使用匿名函数。您将一无所获地打破错误堆栈跟踪。