Обработка ошибок JavaScript: могу ли я сделать ошибку внутри тернарного оператора?
Могу ли я сделать ошибку внутри тернарного оператора? Действительно ли это:
function foo(params) {
var msg = (params.msg) ? params.msg : (throw "error");
// do stuff if everything inside `params` is defined
}
То, что я пытаюсь сделать, это убедиться, что все необходимые параметры, которые находятся в объекте param
, определены и выдают ошибку, если какой-либо из них не определен.
Если это просто глупо, есть ли лучший способ сделать это?
Ответы
Ответ 1
Вы можете сделать это:
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
}
Ответ 2
Нет, это абсолютно запрещено. throw
является выражением и не может быть частью выражения.
К сожалению, я думаю, что единственный способ. Вы можете использовать if
без привязок:
if(!params.msg) throw new Error("msg is required!");
Но нет никаких хороших и простых обходных решений, которые я знаю.
Ответ 3
Вот простой маленький трюк, который выйдет из тройного. Я просто называю несуществующим, невозможным когда-либо существовать свойство на символе undefined. Я только проверил хром, и его можно поймать и повторно бросить, как показано, если вам нужно, чтобы оно имело соответствующее сообщение об ошибке, но это лишнее раздувание
try {
var msg = (params.msg) ? params.msg : (void 0).throwError()
}
catch(e) {
throw new Error('Params has no msg property')
}
Ответ 4
Вы можете выдать такую ошибку внутри троичного оператора,
function isPositive(a) {
if(a > 0)
return "YES";
throw a == 0 ? Error("Zero Error") : Error("Negative Error");
}
Ответ 5
Использовать подход @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!
Ответ 6
Это более чистый способ, который работал для меня:
const msg = params.msg ? params.msg : ((function () { throw new Error('Message not found); }()));
Ответ 7
В этом случае при использовании fetch
, здесь я предлагаю решение для этого конкретного случая:
return fetch(url, request)
.then(response => response.status >= 400 && response.status < 600
? response.json().then(error => {throw new Error(error.message)})
: response);
Обратите внимание на встроенный блок вокруг throw
, который преобразует тело функции-стрелки из выражения (return) в оператор.