2011-03-09 30 views

Respuesta

9

dos razones inmediatamente vienen a la mente:

  1. Simplemente para que no se diga try { ... } catch (Exception e) { ... } - tener sus propias subclases le permite tratar los casos de excepción distintas por separado. (Como la diferencia entre no tener permisos para ejecutar un informe y la ejecución del informe que falla).
  2. Puede agregar contexto adicional; por ejemplo, si tiene su propio AlreadyLoggedInException, por ejemplo, esa excepción puede tener un método para recuperar la dirección IP desde la cual se inició la otra sesión. O un AccountLimitExceededException podría contener el límite de cuenta actual. La información adicional en la excepción le permite potencialmente tomar una respuesta más informada al atraparla.
+1

¿podrías darme un ejemplo de trabajo para que quede más claro para mí? – Deepak

1

Proporcionando información específica de error, lo que permite manejadores de excepciones más finos.

1

Sí. La gran ventaja es que le permite lanzar y excepciones que significan lo que usted quiere que signifiquen. Si reutiliza una excepción existente, cualquier parte de su código que capte la excepción tiene que tratar con la posibilidad de que la excepción real no haya sido lanzada por su código, sino por algún otro código de parte de la biblioteca. Esto tiende a hacer que el manejo de errores sea más lento.

0

Con una excepción personalizada, puede decirle a sus interlocutores que ha ocurrido un tipo específico de error, en lugar de solo un error. Y las personas que llaman pueden hacer algo específico para este tipo de error.

Usemos la analogía de un automóvil: ¿prefiere que su automóvil se niegue a comenzar con una luz roja única parpadeando o con una luz dedicada de "tanque de gasolina vacío" parpadeando?

+1

Sé lo que intenta decir, pero hablar de mensajes no es una buena analogía. Si solo se tratara de mensajes, podríamos simplemente 'lanzar una nueva excepción (" No comenzaré porque me he quedado sin gasolina ")' –

+0

Tienes razón. Como siempre, una analogía con el automóvil no es una muy buena analogía. Editaré mi publicación para evitar hablar de mensajes. –

2

En pocas palabras, le permite manejar cada excepción de la manera correcta.

Considere el siguiente código

try { 
    doSomethingThatCouldThrowManyExceptions(); 

} 
catch (ExceptionalCircumstance1 ex) { 
    // deal with this specific circumstance 
} 
catch (ExceptionalCircumstance2 ex) { 
    // deal with this specific circumstance 
} 
catch (ExceptionalCircumstance3 ex) { 
    // deal with this specific circumstance 
} 
finally { 
    // do some common code 
} 

Sin esto, se quedaría tratando de hacer un cajón de sastre tipo de excepción.

Sin embargo, si todo va bien, la jerarquía de clases todavía significa que aún puede detectar todas las excepciones usando catch(Exception ex) {}.

+0

Es posible que desee cambiar el nombre de las clases a ExceptionalCircumstance2 y ExceptionalCircumstance3 ;-) – perdian

+0

¡Buen punto! El patrón Anti copiar y pegar gana de nuevo. – Codemwnci

0

En mi opinión, la principal motivación para las excepciones personalizadas es lograr un mejor modelado de su dominio de aplicación. Al diseñar las clases, se gasta una gran cantidad de esfuerzo para nombrar objetos y asignar sus responsabilidades. Creo que en este momento es una buena inversión realizar algunos esfuerzos para considerar las posibles condiciones de error. Por ejemplo, al cavar más profundo, los clientes a menudo pueden darle algunos ejemplos comunes que deben manejarse (por ejemplo, datos no válidos, violación de restricciones lógicas, sensores no confiables, etc.). Como resultado, tendrá un código que es más fácil de comprender y modificar. Los errores específicos de la aplicación están muy bien separados y el manejo de errores adicionales se puede lograr fácilmente.

Otro punto es que podría proporcionar una mejor abstracción para diferentes partes del sistema. Por ejemplo, si realmente anticipa que la implementación de la parte de persistencia cambiará en el futuro, entonces es mucho mejor usar excepciones personalizadas en su API.De lo contrario, más adelante te divertirás mucho lidiando con SQLException o SAXExceptions en muchos lugares diferentes :-)

Cuestiones relacionadas