2012-03-03 17 views
7

Esto es lo que quiero hacer:El uso de un tiro en una expresión Javascript

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

Pero el intérprete se queja de "Error de sintaxis: tiro símbolo inesperado".

¿Hay alguna manera de lanzar una excepción en la misma línea que comparamos si un valor es falsey o no?

Respuesta

15

throw es una declaración, no una expresión, por lo que no puede usarla como parte de otra expresión. Usted tiene que dividir:

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

se puede hacer uso de la naturaleza funcional de 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`)(); 

o más genérico crear una función para lanzar errores y el uso que:

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

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

+1 para una solución interesante, aunque parezca un poco exagerada. – casablanca

+0

[IIFE] (https://en.wikipedia.org/wiki/Immediately-invoked_function_expression) no son poco comunes en Javascript. Creo que esto también se vuelve un poco más agradable con las funciones de flecha: 'var setting = process.env.SETTING || (() => {throw "por favor configure $ SETTING";})() ' – Alec

+0

@Alec tienes razón, me encanta cómo se ve súper limpio. Mi única reserva a esta respuesta en general es que las personas que lean el código no tendrán idea de lo que está sucediendo, se convertirá en otro poco de magia de caja negra. los principiantes incluso pueden venir pensando que así es como funciona throw en js. Algún día lo intentarán ellos mismos, y perderán mucho tiempo desentrañando de dónde lo aprendieron y por qué ya no funciona. – Lee

1

throw no tiene un valor de retorno. Entonces no puedes usarlo así. Sin embargo, puede envolver el tiro en una función. Funcionará entonces. Pero será más difícil encontrar la fuente de excepción.

+0

El depurador de Chrome admite un comportamiento de 'punto de corte en caso de excepción'. – Dunes

+0

Muy buen punto acerca de que es más difícil de depurar, gracias. –

+0

-1 Esto es falso y no responde la pregunta. Todo tiene un valor de retorno en JavaScript, ¿no? Y si no devuelves nada, simplemente 'indefinido'. Incluso 'delete', prueba' var foo = ""; alerta (eliminar foo); '.Es solo que 'throw 'rompe el flujo, por lo que realmente no puede obtener y usar su tipo de devolución. – ANeves

1

Lo veo usando nodejs.

Creo que la mejor manera de validar los parámetros de entrada es la aserción. NodeJS han incorporado en el módulo simple afirmación: http://nodejs.org/api/assert.html

y utilizarlo, por ejemplo, así:

var assert = require('assert'); 

// ... 

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

Para entorno de prueba que lo puede hacer como éstos:

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

O:

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

Si no existe ajuste que obtendrá:

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

Por cierto mi experiencia me dice que los valores por defecto para las variables de entorno son malos.

Cuestiones relacionadas