2012-06-11 7 views

Respuesta

16

Igual que en otros lenguajes como C# o Java:

  • throw error tiros el mismo objeto Error
  • throw new Error(error) lo envuelve en un nuevo objeto Error. El último se usa, por ejemplo, en Java cuando necesita convertir checked Exception en uno sin marcar. En JavaScript, no es necesario que envuelva las excepciones, ya que esto haría que stacktrace sea un poco más largo y menos bonito.

Editar: También hay algunas implicaciones de seguridad. He aquí un ejemplo:

function noWrap() { 
    try { 
     var o = {}; o.nonexistingMethod(); 
    } catch (error) { 
     throw error; 
    } 
} 

function wrap() { 
    try { 
     var o = {}; o.nonexistingMethod(); 
    } catch (error) { 
     throw new Error(error); 
    } 
} 

Calling noWrap() produce el siguiente mensaje de error:

"TypeError: Object #<Object> has no method 'nonexistingMethod'" 
// with error.arguments === ['nonexistingMethod', o] 

Calling wrap() produce el siguiente mensaje de error:

"Error: TypeError: Object #<Object> has no method 'nonexistingMethod'" 
// with error.arguments === undefined 

Por lo tanto, como se puede ver mediante el uso de una envolviendo el objeto Error, podemos esconder el arguments del error original. Supongamos que usted está escribiendo una de las siguientes:

  • una especie de una biblioteca
  • un guión que será cargado en una página que no es propietario (por ejemplo, algún tipo de botón o Tweet)
  • una secuencia de comandos en una página que tiene algunos scripts de terceros cargadas (botones sociales, anuncios, código de seguimiento, etc.)

en todos los casos mencionados anteriormente con el fin de permanecer seguro que debe envolver suErrorobjetos. De lo contrario, puede filtrar accidentalmente referencias a sus objetos internos, funciones y variables.

Editar 2: Con respecto a stacktraces. Ambas variantes los preservan. Esto es a working example y consigo los siguientes stacktraces en Chrome:

// No wrapping: 
TypeError: Object #<Object> has no method 'nonexistingMethod' 
    at noWrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:22:23) 
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:37:5 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20 

// Wrapping: 
Error: TypeError: Object #<Object> has no method 'nonexistingMethod' 
    at wrap (http://fiddle.jshell.net/listochkin/tJzCF/show/:32:15) 
    at http://fiddle.jshell.net/listochkin/tJzCF/show/:44:5 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3901:62 
    at http://fiddle.jshell.net/js/lib/mootools-core-1.4.5-nocompat.js:3915:20 
+0

Alguien me aconsejó que la versión envuelta le da un objeto de error con un StackTrace completo, de lo contrario sólo recibe el mensaje de error. –

+0

Él afirma que obtienes la pila de pila porque usas console.error(), si quieres pasar el objeto de error a otra parte, los pierdes. Tiendo a creer que se conservan, pero será interesante investigar esto. –

+1

Depende del navegador. Por ejemplo, en IE9 no hay propiedad 'stack' en los objetos Error. No sé sobre otros navegadores. –

Cuestiones relacionadas