这是我想要做的:
var setting = process.env.SETTING || throw new Error("please set the SETTING environmental variable");
^^^^^
但是翻译抱怨“语法错误:意外的令牌丢失”。
有没有办法在我们比较的同一行中抛出异常,无论值是否为假?
答案 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:
答案 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.SETTING
是undefined
,则会抛出该错误。添加.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我的经验告诉我,环境变量的默认值是邪恶的。