2012-03-03 11 views
7

Ecco cosa voglio fare:Utilizzando tiro in un'espressione JavaScript

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

Ma l'interprete si lamenta "Errore di sintassi: imprevisto tiro Token".

C'è un modo per lanciare un'eccezione nella stessa riga che si confronta se un valore è falso o no?

risposta

15

throw è un'istruzione, non un'espressione, quindi non è possibile utilizzarla come parte di un'altra espressione. Bisogna dividere:

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

si può fare uso della natura funzionale di 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 più generico creare una funzione di gettare gli errori e l'uso che:

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

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

+1 per una soluzione interessante, anche se sembra un po 'eccessivo. – casablanca

+0

[IIFEs] (https://en.wikipedia.org/wiki/Immediately-invoked_function_expression) non sono troppo rari in Javascript. Penso che questo diventi anche un po 'più bello con le funzioni freccia: 'var setting = process.env.SETTING || (() => {throw "per favore imposta $ SETTING";})() ' – Alec

+0

@Alec hai ragione, mi piace come appare super pulito. La mia unica riserva a questa risposta in generale è che la gente che legge il codice non avrà idea di cosa sta succedendo, diventa un altro po 'di magia della scatola nera. i principianti potrebbero anche venire via pensando che è come buttare in js. Un giorno lo provano da soli, e si sprecano un sacco di tempo a dipanarsi da dove lo hanno imparato e perché non funziona più. – Lee

1

throw non ha un valore di ritorno. Quindi non puoi usarlo in questo modo. Comunque puoi avvolgere il lancio in una funzione. Funzionerà allora. Ma sarà più difficile trovare la fonte di eccezione.

+0

Il debugger di Chrome supporta un comportamento di "breakpoint su eccezione". – Dunes

+0

Davvero un buon punto sul fatto che è più difficile eseguire il debug, grazie. –

+0

-1 Questo è falso e non risponde alla domanda. Tutto ha un valore di ritorno in JavaScript, no? E se non restituisci nulla, ottieni "undefined". Anche 'delete', prova' var foo = ""; alert (elimina pippo); '.È solo che 'throw' interrompe il flusso, quindi non puoi davvero ottenere e usare il suo tipo di ritorno. – ANeves

1

Vedo che utilizzi nodejs.

Penso che il modo migliore per convalidare i parametri di input sia l'asserzione. NodeJS sono dotati di semplice modulo asserzione: http://nodejs.org/api/assert.html

E usarlo, per esempio, in questo modo:

var assert = require('assert'); 

// ... 

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

Per ambiente di test che si può farlo come questi:

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

Oppure:

;(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'); 

Se l'impostazione non esiste si otterrà:

… 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 la mia esperienza mi dice che i valori di default per le variabili di ambiente sono il male.

Problemi correlati