Есть ли способ вызвать исключение из выражения, кроме использования функций?

Есть ли способ явно вызвать исключение из выражения в JavaScript, помимо размещения этой throw функции-оболочки?

throw — это оператор, операторы не производят значений, поэтому их нельзя использовать в выражениях, которые работают со значениями и всегда производят значение. Совершенно очевидно, что любой оператор может быть помещен в функцию, и вызов функции может быть использован из выражения. Есть ли способ избежать переноса оператора throw в функцию и прямого выброса из выражения?

ОБНОВИТЬ:

Некоторые говорят, что не совсем понятно, о чем я спрашиваю. Рассмотрим гипотетический пример (не на самом деле), это то, что я хотел бы сработать, но это не так:

var one = value != null ? value * value : (throw new Error('The value has not been provided'));

var two = value != 0 ? 1 / value : (throw new Error('The result cannot be evaluated because the value is zero which would give a division by zero problem.));

person Trident D'Gao    schedule 18.07.2014    source источник
comment
Ваша настоящая проблема не ясна. Что не так с <script>throw 0</script> ?   -  person Denys Séguret    schedule 18.07.2014
comment
Не могли бы вы показать пример или пояснить, что вы имеете в виду?   -  person Declan Cook    schedule 18.07.2014
comment
Зачем вам throw непосредственно из выражения? Вы бы добавили только некоторые условия - так почему бы не использовать блоки if/else или try/catch?... Вы просите однострочную проверку?   -  person Casey Falk    schedule 18.07.2014
comment
Примечание: я попросил разъяснения, я не говорю, что вопрос плохой. Итак... +1.   -  person Denys Séguret    schedule 18.07.2014
comment
@CaseyFalk, я не ищу однострочную проверку. Я пишу код в функциональном стиле, который поощряет использование выражений вместо операторов по многим причинам. Однако это совсем другая история, почему функциональный способ лучше.   -  person Trident D'Gao    schedule 18.07.2014
comment
Право-о. Спасибо за разъяснения.   -  person Casey Falk    schedule 18.07.2014
comment
Это выражение, которое вызывает исключение и не включает перенос: JSON.parse(). Может быть, это не то, что вы хотите, но контекст вашего вопроса мне не ясен. Это почти всегда проблема с вопросами без кода: они расплывчаты.   -  person Denys Séguret    schedule 18.07.2014
comment
Обновлено с парой гипотетических примеров.   -  person Trident D'Gao    schedule 18.07.2014


Ответы (2)


Нет. Как вы сказали, throw — это оператор, а операторы не могут появляться как части выражения.

Единственный способ выполнить оператор из оценки выражения - это вызов функции или eval. Использование функции THROW(new Error(…)), вероятно, лучшее, что вы можете получить.

А если серьезно, используйте простые, читаемые утверждения:

if (value == null) throw new Error('The value has not been provided');
var one = value * value;

if (value == 0) throw new Error('division by zero");
var two = 1 / value;

Это не только сработает, но и впишется в линию.

person Bergi    schedule 18.07.2014
comment
Есть ли эквивалент выражения оператора throw, который выбрасывает? - person Trident D'Gao; 18.07.2014
comment
Нет. Есть некоторые выражения, которые выдают ошибки типа и т. д. во время их оценки, но нет выражения, эквивалентного throw. - person Bergi; 18.07.2014

Да можно из тернарника кинуть! Возможно, кто-то назовет мое решение чем-то вроде хака, но рассуждать об этом очень просто.

бросить из тройки

var two = value != 0 ? 1 / value : (void 0).throwDivideByZero()
person James Wakefield    schedule 15.12.2015