provocar - ¿Cuáles son las prácticas estándar para lanzar excepciones de JavaScript?
try and catch java script (3)
w3schools dice que las excepciones pueden ser cadenas, enteros, valores booleanos u objetos, pero el ejemplo dado no me parece una buena práctica, ya que la verificación del tipo de excepción se realiza mediante la comparación de cadenas. ¿Es este el método preferido de manejo de excepciones en JavaScript? ¿Hay tipos de excepción incorporados (como NullPointerException)? (En caso afirmativo, ¿qué son, qué tipo de herencia utilizan y qué tipo de herencia prefieren?)
La sección 15.11 de la especificación ECMA-262 define varios tipos de Error
que "se lanzan como excepciones cuando se producen errores de tiempo de ejecución ... [también] pueden servir como objetos base para clases de excepción definidas por el usuario". Esa especificación también define otros seis tipos de error que forman parte del lenguaje.
Parece preferible lanzar excepciones de estos tipos (o tipos derivados de ellos) ya que es más fácil determinar su tipo; También tienen una propiedad de mensaje incorporada.
En mi propia experiencia, los bloques try / catch son algo raros y se sienten realmente excepcionales en lugar de ser inevitables como en Java.
Las excepciones pueden ser lo que quieras.
En otros idiomas, las excepciones deben ser instancias, y luego la instrucción catch
elige qué excepciones capturar y cuáles dejar caer por la clase de la instancia.
JavaScript, sin embargo, no tiene esta característica. Solo puede capturar todas las excepciones y, a continuación, ver el valor para decidir qué hacer con él. Si no desea manejar una excepción, debe volver a lanzar el valor capturado manualmente. (Esto inevitablemente hace que catch
enunciados de catch
sean bastante confusos).
Puede decidir implementar sus excepciones como objetos y compararlas con instanceof
. O podría tener valores opacos únicos para comparar. O incluso puedes lanzar cuerdas o números rectos si realmente quieres.
¿Hay tipos de excepción incorporados (como NullPointerException)?
Mas o menos. ECMAScript define algunas clases de error estándar: Error
y sus subtipos EvalError
, RangeError
, ReferenceError
, SyntaxError
, TypeError
, URIError
. Sin embargo, hay problemas de implementación del navegador, por ejemplo, try { nonexistentvar; }
try { nonexistentvar; }
da TypeError
bajo IE en lugar de ReferenceError
. Y hay muchas otras excepciones específicas del navegador, particularmente cuando se trata de DOM.
No es tradicional usar estos objetos directamente, y tratar de subclasificarlos es complicado (ya que JavaScript no tiene un sistema de clases como tal). Tendría que atenerse a sus propias excepciones definidas para el uso de sus propias aplicaciones. Las excepciones no son tan utilizadas en JavaScript.
Podrías probar el proyecto Base de Dean Edwards. Emula la herencia de clase en javascript, por lo que su uso le permitiría subclasificar el tipo de error. No puede detectar diferentes tipos de errores en javascript (ya que no es un lenguaje tipificado fuerte), pero podría determinar el tipo de Error que se generó y agregar lógica para ese tipo específico, como por ejemplo:
try {
// do something
} catch (e) {
if (e instanceof NullPointerError) {
// handle nullpointer exception
} else if (e instanceof RuntimeError) {
// handle runtime exception
} else {
// regular exception
}
}
Por supuesto, en este código asumo que ha declarado las clases NullPointerError y RuntimeError como subclases de Error.