try provocar manejo lanzar excepciones excepcion errores error catch javascript exception exception-handling custom-exceptions

provocar - Lanzar excepciones personalizadas en Javascript. ¿Qué estilo usar?



provocar error javascript (2)

Estoy a favor de la segunda, ya que es más reutilizable en términos de pureza de código. Para ser precisos, si estoy a punto de lanzar la misma excepción (incluso el mismo tipo de excepción con un mensaje diferente) en varios lugares, mi código se ensuciaría (inmenso) con la primera aproximación.

Douglas Crockford recomienda hacer algo como esto:

throw { name: "System Error", message: "Something horrible happened." };

Pero también podrías hacer algo como esto:

function IllegalArgumentException(message) { this.message = message; } throw new IllegalArgumentException("Argument cannot be less than zero");

y luego hacer:

try { //some code that generates exceptions } catch(e) { if(e instanceof IllegalArgumentException) { //handle this } else if(e instanceof SomeOtherTypeOfException) { //handle this } }

Supongo que podría incluir una propiedad de type en la implementación de Crockford y luego examinarla en lugar de hacer una instanceof . ¿Hay alguna ventaja de hacer uno contra el otro?


Tenga en cuenta que mientras tanto, la mayoría de los entornos JavaScripts proporcionan el objeto Error como base para las excepciones. Ya le permite definir un mensaje, pero también proporciona una propiedad de pila útil para rastrear el contexto de la excepción. Puede crear su propio tipo de excepción usando herencia prototípica. Ya hay varias discusiones de (por ejemplo: here ), cómo hacerlo correctamente. Sin embargo, tuve que cavar un poco hasta que encontré el enfoque correcto y moderno. Tenga en cuenta que el enfoque que se sugiere en la documentación de Mozilla (ver más arriba) no le gusta a la comunidad . Después de mucho leer, salí con ese enfoque para heredar de Error.prototype:

function IllegalArgumentException(sMessage) { this.name = "IllegalArgumentException"; this.message = sMessage; this.stack = (new Error()).stack; } IllegalArgumentException.prototype = Object.create(Error.prototype); IllegalArgumentException.prototype.constructor = IllegalArgumentException;