¿Cuál es la diferencia entre` lanzar nuevo error `y`lanzar SomeObject'?


Quiero escribir un manejador de errores común que capturará errores personalizados lanzados a propósito en cualquier instancia del código.

Cuando hice throw new Error('sample') como en el siguiente código

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

El registro se muestra en Firefox como Error: [object Object] y no pude analizar el objeto.

Para el segundo throw el registro se muestra como: Error: hehe

Mientras que cuando lo hice

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

La consola se mostró como: Object { hehe="haha"} en la que pude acceder a las propiedades de error.

¿Qué es el diferencia?

Es la diferencia, como se ve en el código? Like string se pasará como string y object como objetos, pero la sintaxis será diferente?

No he explorado lanzar objeto de error had solo había arrojado cadenas.

¿Hay alguna otra manera que los dos métodos mencionados anteriormente?

Author: Xufox, 2012-02-06

4 answers

Aquí hay una buena explicación sobre El objeto de Error y lanzar sus propios errores

El Objeto de Error

Justo lo que podemos extraer de él en caso de un error. El objeto Error en todos los navegadores admite las siguientes dos propiedades:

  • Name: El nombre del error, o más específicamente, el nombre de la función constructora a la que pertenece el error.

  • Mensaje: Una descripción del error, con esta descripción variando dependiendo del navegador.

La propiedad name puede devolver seis valores posibles, que como se mencionó corresponden a los nombres de los constructores del error. Son:

Error Name          Description

EvalError           An error in the eval() function has occurred.

RangeError          Out of range number value has occurred.

ReferenceError      An illegal reference has occurred.

SyntaxError         A syntax error within code inside the eval() function has occurred.
                    All other syntax errors are not caught by try/catch/finally, and will
                    trigger the default browser error message associated with the error. 
                    To catch actual syntax errors, you may use the onerror event.

TypeError           An error in the expected variable type has occurred.

URIError            An error when encoding or decoding the URI has occurred 
                   (ie: when calling encodeURI()).

Lanzar tus propios errores (excepciones)

En lugar de esperar a que ocurra uno de los 6 tipos de errores antes de que el control se transfiera automáticamente del bloque try al bloque catch, también puede lanzar explícitamente sus propias excepciones para forzar que eso ocurra bajo demanda. Esto es ideal para crear sus propias definiciones de lo que es un error y cuándo se debe transferir el control a catch.

 171
Author: Hemant Metalia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-11 16:53:20

El siguiente artículo tal vez entra en más detalle en cuanto a cuál es una mejor opción; throw 'An error' o throw new Error('An error'):

Http://www.nczonline.net/blog/2009/03/10/the-art-of-throwing-javascript-errors-part-2/

Sugiere que este último (new Error()) es más confiable, ya que navegadores como Internet Explorer y Safari (no están seguros de las versiones) no informan correctamente el mensaje cuando usan el primero.

Al hacerlo, se producirá un error, pero no todos los navegadores responde como esperarías. Firefox, Opera y Chrome muestran un mensaje de "excepción no capturada" y luego incluyen la cadena de mensaje. Safari e Internet Explorer simplemente lanzan un error de "excepción no capturada" y no proporcionan la cadena de mensaje en absoluto. Claramente, esto es subóptimo desde un punto de vista de depuración.

 55
Author: Ed .,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-22 17:28:43

Lanza "Soy malvado"

Throw terminarála cadena de mensaje posterior de ejecución y exposición en atrapará el error.

try{
    throw 'I\'m Evil'
    console.log('You\'ll never reach to me', 123465)
}
catch(e){
    console.log(e); //I\'m Evil
}

La consola después de lanzar nunca se alcanzará causa de terminación.

Lanzar nuevo error ("Soy tan dulce")

lanzar nuevo error expone un evento de error con dos parámetros nombre & mensaje . It also terminate further execution

try{
     throw new Error('I\'m Evil')
     console.log('You\'ll never reach to me', 123465)
}
catch(e){
        console.log(e.name, e.message); //Error, I\'m Evil
}
 39
Author: Nishchit Dhanani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-08 03:01:44

Primero mencionas este código:

throw new Error('sample')

Y luego en tu primer ejemplo escribes:

throw new Error({'hehe':'haha'}) 

El primer objeto de error realmente funcionaría, porque está esperando un valor de cadena, en este caso 'sample'. El segundo no lo haría porque está tratando de pasar un objeto, y está esperando una cadena.

El objeto error tendría la propiedad "message", que sería 'sample'.

 22
Author: IonicBurger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-08 14:56:11