在Javascript表达式中使用throw

rta7y2nd  于 2023-01-04  发布在  Java
关注(0)|答案(8)|浏览(128)

下面是我想做的:

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

但是解释器会抱怨“语法错误:意外的令牌引发””。
有没有办法在我们比较一个值是否为falsey的同一行中抛出一个异常?

k5hmc34c

k5hmc34c1#

你可以利用javascript的功能特性:

var setting = process.env.SETTING || 
               function(){ 
                 throw "please set the SETTING environmental variable";
               }();
// es201x
const 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");

我使用的一个片段:

const throwIf = (
  assertion = false, 
  message = `An error occurred`, 
  ErrorType = Error) => 
      assertion && (() => { throw new ErrorType(message); })();

throwIf(!window.SOMESETTING, `window.SOMESETTING not defined`, TypeError);
dgsult0t

dgsult0t2#

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

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

snvhrwxg3#

有一个草案建议在JavaScript/ECMAScript中引入throw表达式(类似于C#7的throw表达式):
∮ ∮ ∮ ∮

izkcnapc

izkcnapc4#

用大括号把它包起来

{throw ...}

或者用一个函数 Package 它(实际上是用大括号 Package 它)

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

i7uaboj45#

throw没有返回值,所以你不能这样使用它,但是你可以把抛出的代码封装在一个函数中,这样它就可以工作了,但是要找到异常的来源就比较困难了。

agxfikkp

agxfikkp6#

我看到你在使用nodej。
我认为验证输入参数最好的方法是Assert,NodeJS内置了简单的Assert模块: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')));
8e2ybdfx

8e2ybdfx7#

这不是对这个问题的直接回答,但如果你使用TypeScript,我发现runtypes是手动验证和抛出的一个很好的替代方法。虽然OP中的方法在输入类型为output | null | undefined或类似的时候有效,但runtypes在输入类型为any的时候也有效,比如在防御性地解码一个已知结构的JSON时。
您可以这样使用它:

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

如果process.env.SETTINGundefined,它将抛出。添加.withConstraint()以添加其他条件。该库实际上相当强大,不仅可以验证简单类型,还可以以类型安全的方式验证记录(接口)、联合体等。
一个缺点是您无法自定义错误消息(“Failed constraint check”),这在许多快速和肮脏的情况下是可以的,因为发生错误的行将告诉您问题是什么。
io-ts是另一个类似的库,尽管它似乎有一个更复杂的方法,目前正在变化。

lzfw57am

lzfw57am8#

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.

顺便说一句,我的经验告诉我,默认值的环境变量是邪恶的。

相关问题