2012-02-21 11 views
12

¿Puedo arrojar un error dentro de un operador ternario? Es esto válido:Manejo de errores de JavaScript: ¿puedo arrojar un error dentro de un operador ternario?

function foo(params) { 

    var msg = (params.msg) ? params.msg : (throw "error"); 

    // do stuff if everything inside `params` is defined 
} 

Lo que estoy tratando de hacer es asegurarse de que todos los parámetros necesarios, que están en un objeto param, se define y se emite un error si alguno no está definido.

Si esto es simplemente una tontería, ¿hay un mejor enfoque para hacer esto?

+1

Si realmente deseaba usar la instrucción condicional, podría tener una función que arroje el error por usted. 'var msg = (params.msg)? params.msg: _throw ("error"); '' función _throw (m) {throw m; } ' –

Respuesta

18

Usted puede hacer esto:

function foo(params) { 

    var msg = (params.msg) ? params.msg : (function(){throw "error"}()); 

    // do stuff if everything inside `params` is defined 
} 

realmente no lo recomendaría sin embargo, que lo convierte en código ilegible.

Esto también funcionaría (no es que en realidad es mucho mejor):

function foo(params) { 

    var msg = params.msg || (function(){throw "error"}()); 

    // do stuff if everything inside `params` is defined 
} 

O para un enfoque más limpio, crea una función llamada.

function _throw(m) { throw m; } 
function foo(params) { 

    var msg = params.msg || _throw("error"); 

    // do stuff if everything inside `params` is defined 
} 
+0

interesante ... +1 gracias por proporcionar un enfoque diferente.Estoy de acuerdo en que esta no es una buena manera de hacer las cosas. Me gusta el enfoque 'if's múltiple mejor – Hristo

+0

@minitech: ¿Por qué revertiste la solución de función nombrada que agregué? –

+0

@amnotiam: Gran cambio. Escribe tu propia respuesta si quieres construir mucho en ella sin siquiera notificar al respondedor original. – Ryan

7

No, no está permitido en absoluto. throw es una afirmación y no puede ser parte de una expresión.

Desafortunadamente, creo que esa es la única manera. Puede utilizar if s sin los apoyos:

if(!params.msg) throw new Error("msg is required!"); 

pero no hay ningún soluciones agradables, fáciles, que yo sepa.

+1

hmmm ... Estaba tratando de evitar el' si's, pero parece que va a lograr lo mismo. gracias por la respuesta :) – Hristo

1

Aquí hay un pequeño truco simple que tirar de un ternario. Simplemente estoy llamando a una propiedad inexistente, imposible de existir, en el símbolo indefinido. Sólo he comprobado cromo, y puede ser capturado y re-lanzado como se muestra si se necesita tener un mensaje de error apropiado, pero que es la hinchazón innecesaria

try { 
    var msg = (params.msg) ? params.msg : (void 0).throwError() 
} 
catch(e) { 
    throw new Error('Params has no msg property') 
} 
1

Para construir sobre el enfoque de @ dagg y el ejemplo named function; Aquí es lo mismo pero con los parámetros por defecto con ES6:

function _throw(m) { throw new Error(m); } 
 

 
function foo({ msg = _throw('msg parameter not defined') } = {}) { 
 
    console.log(msg); 
 
} 
 

 
foo({ msg : 'party people!' }); // :D 
 
foo({}); // throws!

0

encontramos con este durante el uso de fetch, aquí está la solución que ofrezco para ese caso particular:

return fetch(url, request) 
    .then(response => response.status >= 400 && response.status < 600 
    ? response.json().then(error => {throw new Error(error.message)}) 
    : response); 

Nota del (en línea) bloquear alrededor de throw que transforma el cuerpo de la función de flecha de una expresión (retorno) en una declaración.

Cuestiones relacionadas