¿Puedo definir tipos personalizados para excepciones definidas por el usuario en JavaScript? Si es así, ¿cómo lo haría?
javascript
exception
Manki
fuente
fuente
Respuestas:
De WebReference :
fuente
catch (e) { if (e instanceof TypeError) { … } else { throw e; } }
⦃⦄ ocatch (e) { switch (e.constructor) { case TypeError: …; break; default: throw e; }
⦃⦄.Debe crear una excepción personalizada que herede prototípicamente de Error. Por ejemplo:
Esta es básicamente una versión simplificada de lo que desapareció publicado anteriormente con la mejora de que los seguimientos de pila funcionan en Firefox y otros navegadores. Satisface las mismas pruebas que publicó:
Uso:
Y se comportará se espera:
fuente
Puede implementar sus propias excepciones y su manejo, por ejemplo, como aquí:
Hay otra sintaxis para detectar una excepción escrita, aunque esto no funcionará en todos los navegadores (por ejemplo, no en IE):
fuente
Si. Puedes lanzar lo que quieras: enteros, cadenas, objetos, lo que sea. Si desea lanzar un objeto, simplemente cree un nuevo objeto, tal como lo haría en otras circunstancias, y luego tírelo. La referencia de Javascript de Mozilla tiene varios ejemplos.
fuente
Esto permite el uso como ...
fuente
e instanceof Error
sería falso.e instanceof MyError
sería cierto, laelse if(e instanceof Error)
declaración nunca sería evaluada.else if(e instanceof Error)
sería la última captura? Probablemente seguido de un simpleelse
(que no incluí). Algo así comodefault:
en una declaración de cambio pero para errores.En breve:
Si está utilizando ES6 sin transpiladores :
Consulte Error de extensión en Javascript con sintaxis ES6 para conocer cuál es la mejor práctica actual
Si está utilizando el transpilador Babel :
Opción 1: use babel-plugin-transform-builtin-extend
Opción 2: hágalo usted mismo (inspirado en esa misma biblioteca)
Si está utilizando ES5 puro :
Alternativa: use el marco Classtrophobic
Explicación:
¿Por qué extender la clase Error usando ES6 y Babel es un problema?
Porque una instancia de CustomError ya no se reconoce como tal.
De hecho, a partir de la documentación oficial de Babel, que no se puede sacar ninguna incorporadas en el lenguaje JavaScript , como
Date
,Array
,DOM
oError
.El problema se describe aquí:
¿Qué pasa con las otras respuestas SO?
Todas las respuestas dadas solucionan el
instanceof
problema, pero pierde el error regularconsole.log
:Mientras que usando el método mencionado anteriormente, no solo soluciona el
instanceof
problema sino que también mantiene el error regularconsole.log
:fuente
Aquí es cómo puede crear errores personalizados con un
Error
comportamiento completamente idéntico al del nativo . Esta técnica solo funciona en Chrome y node.js por ahora. Yo también no recomendaría usarlo si usted no entiende lo que hace.Como resultado obtenemos
Entonces puedes usarlo así:
Y use
NotImplementedError
como lo haríaError
:Y se comportará se espera:
Tenga en cuenta que eso
error.stack
funciona absolutamente correcto y no incluirá laNotImplementedError
llamada del constructor (gracias a v8Error.captureStackTrace()
).Nota. Hay feo
eval()
. La única razón por la que se usa es para corregirloerr.constructor.name
. Si no lo necesita, puede simplificar un poco todo.fuente
Error.apply(self, arguments)
Se especifica que no funciona . Sugiero copiar el seguimiento de la pila, que es compatible con todos los navegadores.A menudo uso un enfoque con herencia prototípica. La anulación
toString()
le brinda la ventaja de que herramientas como Firebug registrarán la información real en lugar de[object Object]
en la consola para excepciones no detectadas.Utilizar
instanceof
para determinar el tipo de excepción.main.js
Exception.js
DuplicateIdException.js
fuente
ES6
Con la nueva clase y ampliar palabras clave ahora es mucho más fácil:
fuente
Usa el tiro declaración de .
A JavaScript no le importa cuál es el tipo de excepción (como lo hace Java). JavaScript solo se da cuenta, hay una excepción y cuando la detecta, puede "mirar" lo que dice la excepción ".
Si tiene diferentes tipos de excepción que debe lanzar, le sugiero que use variables que contengan la cadena / objeto de la excepción, es decir, el mensaje. Cuando lo necesite, use "throw myException" y en la captura, compare la excepción capturada con myException.
fuente
Vea este ejemplo en el MDN.
Si necesita definir múltiples errores (¡pruebe el código aquí !):
El código se copia principalmente de: ¿Cuál es una buena manera de extender Error en JavaScript?
fuente
Una alternativa a la respuesta de asselin para usar con las clases de ES2015
fuente
Ahora establecemos agregar el motivo o las propiedades que queramos al objeto de error y recuperarlo. Al hacer el error más razonable.
fuente