Quiero escribir un controlador de errores común que detecte errores personalizados lanzados a propósito en cualquier instancia del código.
Cuando me throw new Error('sample')
gustó 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.
¿Cuál es la diferencia?
¿Es la diferencia como se ve en el código? ¿La cadena similar se pasará como cadena y el objeto como objetos, pero la sintaxis será diferente?
No he explorado arrojar objetos de error ... solo había arrojado cadenas.
¿Hay alguna otra manera que los dos métodos mencionados anteriormente?
fuente
Error
sRespuestas:
Aquí hay una buena explicación sobre el objeto The Error y arrojar sus propios errores.
El objeto de error
¿Qué podemos extraer de él en caso de error? El objeto Error en todos los navegadores admite las siguientes dos propiedades:
nombre: 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, que varía según el navegador.
La propiedad de nombre puede devolver seis valores posibles, que como se mencionan corresponden a los nombres de los constructores del error. Son:
Lanzar sus 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 desde el bloque try al bloque catch, también puede lanzar explícitamente sus propias excepciones para forzar que eso suceda a pedido. Esto es excelente para crear sus propias definiciones de qué es un error y cuándo se debe transferir el control para capturar.
fuente
Error
(y las subclases) se usan por convención. También proporcionan de manera predeterminada una propiedad de pila, aunque eso podría agregarse manualmente a cualquier otra. Por lo tanto, en realidad es principalmente una convención, el flujo del programa no se ve afectado por lo que arrojas, solo por lo que a ti tethrow
importa. Podríathrow "grandmother down the stairs";
y funcionaría igual, excepto que no habrá un seguimiento de pila adjunto y funciones de manejo de errores, los reporteros, los depuradores esperanError
, o las propiedades que vienen, para ser más precisos.tirar "Soy malvado"
throw
se terminará la ejecución ulterior y exponer cadena de mensaje en la captura del error.La consola después del lanzamiento nunca se alcanzará debido a la terminación.
lanzar un nuevo error ("Soy tan dulce")
throw new Error
expone un evento de error con dos parámetros nombre y mensaje . También termina la ejecución posteriorfuente
Error
, bueno, ¿dónde está la conexión con el comentario? La mitad de las personas que comentan y responden a las preguntas de los OP deberían haberse quedado en silencio.Used as a function
desde este enlace ... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…El siguiente artículo tal vez entra en más detalles sobre cuál es una mejor opción;
throw 'An error'
othrow 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 los navegadores como Internet Explorer y Safari (no están seguros de las versiones) no informan correctamente el mensaje cuando usan el primero.fuente
Primero mencionas este código:
y luego en tu primer ejemplo escribes:
El primer objeto Error funcionaría realmente, porque está esperando un valor de cadena, en este caso 'muestra'. El segundo no lo haría porque está intentando pasar un objeto y está esperando una cadena.
El objeto de error tendría la propiedad "mensaje", que sería 'muestra'.
fuente
toString()
método en el objeto pasado, lo que resulta[object Object]
en el error (como escribió el Op).TLDR: son equivalentes.
fuente: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error
fuente
puedes
throw
como objetoentonces por ejemplo en tu
try/catch
o simplemente arrojar un error de cadena
fuente
El
Error
constructor se usa para crear un objeto de error. Se lanzan objetos de error cuando se producen errores de tiempo de ejecución. El objeto Error también se puede usar como un objeto base para excepciones definidas por el usuario.Los errores definidos por el usuario se generan a través de la
throw
declaración. el control del programa se pasará al primercatch
bloque en la pila de llamadas.La diferencia entre lanzar un error con y sin objeto Error:
En Chrome Devtools se ve así:
Chrome nos dice que tenemos un error no detectado que solo es un objeto JS. El objeto en sí podría tener información sobre el error, pero aún no sabemos de inmediato de dónde vino. No es muy útil cuando trabajamos en nuestro código y lo depuramos.
En Chrome Devtools se ve así:
Un error arrojado con el objeto Error nos da un seguimiento de la pila cuando lo expandimos. Esto nos da información valiosa de dónde proviene el error, que a menudo es información valiosa al depurar su código. Además, tenga en cuenta que el error dice que
[object Object]
esto se debe a que elError
constructor espera una cadena de mensaje como primer argumento. Cuando recibe un objeto, lo convertirá en una cadena.fuente
Comportamiento de reacción
Además del resto de las respuestas, me gustaría mostrar una diferencia en React.
Si lanzo
new Error()
ay estoy en modo de desarrollo, obtendré una pantalla de error y un registro de consola. Si lanzo un literal de cadena, solo lo veré en la consola y posiblemente lo pierda, si no estoy viendo el registro de la consola.Ejemplo
Lanzar un error inicia sesión en la consola y muestra una pantalla de error mientras está en modo de desarrollo (la pantalla no será visible en producción).
Mientras que el siguiente código solo inicia sesión en la consola:
fuente