Подтвердить что ты не робот

Обработка ошибок JavaScript: могу ли я сделать ошибку внутри тернарного оператора?

Могу ли я сделать ошибку внутри тернарного оператора? Действительно ли это:

function foo(params) {

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

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

То, что я пытаюсь сделать, это убедиться, что все необходимые параметры, которые находятся в объекте param, определены и выдают ошибку, если какой-либо из них не определен.

Если это просто глупо, есть ли лучший способ сделать это?

4b9b3361

Ответ 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) в оператор.