在Javascript表达式中使用throw

时间:2012-03-03 09:32:40

标签: javascript node.js throw

这是我想要做的:

var setting = process.env.SETTING || throw new Error("please set the SETTING environmental variable");
                                     ^^^^^

但是翻译抱怨“语法错误:意外的令牌丢失”。

有没有办法在我们比较的同一行中抛出异常,无论值是否为假?

8 个答案:

答案 0 :(得分:18)

throw是一个语句,而不是表达式,因此您不能将其用作另一个表达式的一部分。你必须分开它:

var setting = process.env.SETTING;
if (!setting) throw new Error("please set the SETTING environmental variable");

答案 1 :(得分:14)

您可以利用javascript的功能性:

var setting = process.env.SETTING || 
               function(){ 
                 throw "please set the SETTING environmental variable";
               }();
// es201x
var setting = process.env.SETTING || 
              (() => {throw `SETTING environmental variable not set`})();

或更通用创建一个函数来抛出错误并使用它:

function throwErr(mssg){
    throw new Error(mssg);
}

var setting = process.env.SETTING || 
               throwErr("please set the SETTING environmental variable");

答案 2 :(得分:2)

有一个提案草案将throw表达式(类似于C#7' s throw expressions)引入JavaScript / ECMAScript:

TC39 proposal: Throw Expressions

答案 3 :(得分:1)

throw没有返回值。所以你不能那样使用它。但是你可以将throw包装在一个函数中。它会工作的。但要找到异常来源会更难。

答案 4 :(得分:1)

我看到你使用nodejs。

我认为验证输入参数的最佳方法是断言。 NodeJS具有内置的简单断言模块:http://nodejs.org/api/assert.html

并使用它,例如,像这样:

var assert = require('assert');

// ...

function myFunction (param) {
    assert(param, 'please pass param');
    // ...
}

对于测试环境,您可以这样做:

require('assert')(process.env.setting, 'please set the SETTING environmental variable');

或者:

;(function (a) {
    a(process.env.setting, 'please set the SETTING environmental variable');
    a(process.env.port, 'please set the PORT environmental variable');
}(require('assert')));

答案 5 :(得分:1)

只需用大括号将其包裹

{throw ...}

或使用函数将其包装(巫婆实际上将其包装在大括号内)

()=>{throw ..}
//or:
function(){throw..}

答案 6 :(得分:1)

这不是问题的直接答案,但是如果您使用的是TypeScript,我发现runtypes是手动验证和抛出错误的绝佳选择。虽然OP中的方法在输入类型为output | null | undefined或类似的情况下有效,但运行类型在输入类型为any时也有效,例如,以已知结构防御性解码JSON。

您将这样使用它:

import { String } from 'runtypes';
const setting = String.check(process.env.SETTING)

如果process.env.SETTINGundefined,则会抛出该错误。添加.withConstraint()以添加其他条件。该库实际上非常强大,并且可以以类型安全的方式不仅验证简单类型​​,还可以验证记录(接口),联合等。

一个缺点是您无法自定义错误消息(“约束检查失败”),这在很多快速和肮脏的情况下都是可以的,因为发生错误的行会告诉您问题出在哪里是。

io-ts是另一个类似的库,尽管它似乎具有更复杂的方法并且目前还在不断变化。

答案 7 :(得分:0)

const getenv = require('getenv');
const setting = getenv('SETTING');

如果SETTING不存在,您将获得:

… getenv.js:14
throw new Error('GetEnv.Nonexistent: ' + varName + ' does not exist ' +
^ Error: GetEnv.Nonexistent: SETTING does not exist and no fallback value provided.

BTW我的经验告诉我,环境变量的默认值是邪恶的。