我是否允许在三元运算符中抛出错误?这是有效的吗?
function foo(params) {
var msg = (params.msg) ? params.msg : (throw "error");
// do stuff if everything inside `params` is defined
}
我要做的是确保定义param
对象中所需的所有参数,如果未定义任何参数,则抛出错误。
如果这只是愚蠢的,有没有更好的方法来做到这一点?
答案 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)
这是不可能的,您不应为此使用匿名函数。您将一无所获地打破错误堆栈跟踪。