【问题标题】:JavaScript error handling: can I throw an error inside a ternary operator?JavaScript 错误处理:我可以在三元运算符中抛出错误吗?
【发布时间】:2012-03-11 08:28:18
【问题描述】:

我可以在三元运算符中抛出错误吗?这是否有效:

function foo(params) {

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

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

我要做的是确保所有需要的参数(位于 param 对象中)都已定义,如果任何一个未定义,则会引发错误。

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

【问题讨论】:

  • 如果你真的想使用条件语句,你可以有一个函数为你抛出错误。 var msg = (params.msg) ? params.msg : _throw("error");function _throw(m) { throw m; }
  • 想要这样做并不愚蠢,我真的希望我能做到。只是出于兴趣,在 C#/.NET 中已经有一段时间了。 docs.microsoft.com/en-us/dotnet/csharp/language-reference/…

标签: javascript error-handling


【解决方案1】:

不,绝对不允许。 throw 是一个语句,它不能是表达式的一部分。

不幸的是,我认为这是唯一的方法。您可以使用不带大括号的ifs:

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

但据我所知,没有任何好的、简单的解决方法。

【讨论】:

  • hmmm...我试图避免ifs,但似乎它会完成同样的事情。谢谢你的回答:)
【解决方案2】:

你可以这样做:

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 感谢您提供不同的方法。我同意这不是做事的好方法。我更喜欢多个ifs 方法
  • 这完美地回答了这个问题,但我真的不觉得它应该被认可为最佳实践。恕我直言,使用“if”条件似乎更符合@Dagg Nabbit 的隐含思想和整个语言。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    以@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】:

      在使用fetch 时遇到了这个问题,这是我针对这种特殊情况提供的解决方案:

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

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

        • 你确定吗?从三元组抛出错误似乎很奇怪,因为三元组通常用于设置常量。似乎 if-else 或 try-catch 更具可读性对吧?
        • 理想情况下是的,如果其他方法更好,可以抛出更多错误。对于上述场景,我认为三元将起作用,因为没有更多的场景需要覆盖
        • 这个问题是你必须抛出错误......我猜......所以它没有完全有条件地这样做,因为你没有选择不在这里抛出
        【解决方案7】:

        这是一种对我有用的更清洁的方式:

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

        【讨论】:

          【解决方案8】:

          在@daggs 的基础上回答一个更清洁的方法可能是

          function foo(params) {
          
             var err = function () {
              throw "error";
            };
          
              var msg = (params.msg) ? params.msg : err();
          
              // do stuff if everything inside `params` is defined
          }
          

          【讨论】:

            【解决方案9】:

            这是不可能的,您不应该为此使用匿名函数。您将一劳永逸地破坏错误堆栈跟踪。

            【讨论】:

              【解决方案10】:

              如果您以 nodejs 为目标,您可以在表达式中使用它:

              require('assert').fail('Bad response from server or whatever')
              

              给予:

              AssertionError [ERR_ASSERTION]: Bad response from server or whatever
              

              【讨论】:

                猜你喜欢
                • 2017-09-05
                • 1970-01-01
                • 2023-03-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-06-24
                • 2021-02-08
                • 2020-12-12
                相关资源
                最近更新 更多