2010-05-13 19 views
27

w3schools dice que las excepciones pueden ser cadenas, enteros, 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 a través de la comparación de cadenas. ¿Es este el método preferido de manejo de excepciones en JavaScript? ¿Hay tipos de excepciones integradas (como NullPointerException)? (en caso afirmativo, ¿qué son, qué tipo de herencia utilizan, y se prefieren sobre otras opciones?)¿Cuáles son las prácticas estándar para arrojar excepciones de JavaScript?

+2

Puede encontrar útil esta pregunta SO: http://stackoverflow.com/questions/783818/how-do-i-create-a-custom-error-in-javascript – Adam

Respuesta

10

Las excepciones pueden ser lo que quieras.

En otros idiomas, las excepciones deben ser instancias, y luego la declaración catch elige qué excepciones capturar y cuáles dejar pasar por la clase de la instancia.

JavaScript, sin embargo, no tiene esta característica. Solo puede capturar todas las excepciones, y luego 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 las declaraciones catch sean bastante complicadas.)

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)?

Tipo de. 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; } da TypeError en IE en lugar de ReferenceError. Y hay muchas otras excepciones específicas del navegador, especialmente cuando se trata del DOM.

No es tradicional usar estos objetos directamente, y tratar de subclase es complicado (ya que JavaScript no tiene un sistema de clase como tal).En su lugar, tenderá a atenerse a sus propias excepciones definidas para el uso de sus propias aplicaciones. Las excepciones no son muy utilizadas en JavaScript.

2

Puede probar Dean Edwards 'Base project. Emula la herencia de clase en javascript, por lo que usarlo le permitiría crear una subclase del tipo de error. No puede detectar diferentes tipos de errores en javascript (ya que no es un lenguaje fuerte), pero puede determinar el tipo de error que se lanzó y agregar lógica para ese tipo específico, así:

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 supongo que ha declarado las clases NullPointerError y RuntimeError como subclases de Error.

4

La sección 15.11 del ECMA-262 specification define varios tipos Error que "se lanzan como excepciones cuando se producen errores de tiempo de ejecución ... [ellos] también pueden servir como objetos base para clases de excepciones definidas por el usuario". Esa especificación también define six other error types que son 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.

Cuestiones relacionadas