2008-10-26 15 views

Respuesta

25

Creo que debe hacerse una pregunta ligeramente diferente "¿Qué ventaja tiene la creación de un nuevo ¿Qué excepción me dan los desarrolladores que usan mi código? " Realmente, la única ventaja que le da a usted u otras personas es la capacidad de manejar la excepción. Parece una respuesta obvia pero realmente no lo es. Solo debe manejar excepciones de las que pueda recuperarse razonablemente. Si la excepción que lanzas es un error realmente fatal, ¿por qué darles a los desarrolladores la oportunidad de manipularlo mal?

discusión más profunda: Custom exceptions: When should you create them?

+3

También crea uno si no quieres confundir al usuario ... java.lang.Exception podría significar un trillón de cosas que podrían haber salido mal ... ser específico con, por ejemplo, AppFileNotFound (sFilePath): ayuda a reducir los problemas al andar ... – Gishu

7

Cuando quiero tratar a mis excepciones diferente a todos los demás. Si quiero atrapar el mío y propagar el de los demás, o si quiero atrapar el de alguien más y propagar el mío, o si quiero atrapar ambos pero tratarlos de manera diferente, entonces definiré una clase separada para mis excepciones. Si quiero tratarlos todos igual, ya sea al propagar ambos o capturar ambos (y hacer lo mismo de cualquier forma con las excepciones detectadas), usaré la clase estándar.

-1

En la mayoría de los casos, no tiene sentido crear su propia clase de excepción.

Existe una tendencia en los programadores novatos a crear su propia clase de excepción solo para que puedan usar un nombre que sea más indicativo del tipo de error. Por lo tanto, encontrará clases como FTPInitializationException, DAOFactoryException, etc. aunque tales excepciones no se manejen de forma diferente a las excepciones estándar. Este es claramente un patrón anti que debe evitarse.

+0

Aconsejar a los programadores que lanzan una java.lang.Exception es mucho peor que lanzar su propia clase que extiende java.lang.Exception; hay muchas excepciones que extienden j.l.Exception que no debe capturarse. – janm

+0

Downvoted. Está bien que la gente arroje directamente "RuntimeException" sin subclases, porque no se espera que los llamadores puedan recuperarse. Pero cuando lanza "Excepción", espera que la persona que llama pueda recuperarse. Pero si no les das una subclase específica, ¿cómo pueden tener suficiente contexto para recuperarse? – benjismith

2

Comience siempre utilizando las clases de excepciones comunes y cuando parezca que hay una necesidad de manejarlo especialmente, cámbielo.

  1. Al crear un método por primera vez, solo deje pasar las excepciones.

  2. Si hay excepciones que deben manejarse, esas pueden definirse simplemente en throws o envueltas en alguna excepción de tiempo de ejecución o en wrap throw throws. Prefiero las excepciones de tiempo de ejecución en muchos casos. Se debe evitar la definición de definiciones de lanzamientos hasta que sea necesario desde el punto de vista de la API.

  3. Más adelante cuando parece que una necesidad hace un manejo específico para una excepción en alguna persona que llama, vuelva y cree una nueva excepción para ella.

El objetivo es evitar hacer trabajo extra antes de saber qué se necesita.

+1

La clase de excepción es especial; "catch (Exception e)" atrapará todo tipo de cosas que probablemente no deberías atrapar. – janm

+0

No estoy diciendo que lo atrape. Que "clases de excepciones comunes" podría significar incluso su propia excepción común. El objetivo es evitar crear clases específicas antes de que las necesite. – iny

+0

Creo que vale la pena dejar eso en claro en su respuesta; la única "clase de excepción común" en la pregunta era java.lang.Exception; usar eso es malo. Si tiene "throws Exception" en su especificación de excepción, las personas que llaman se ven obligadas a tratar con todo. – janm

6

SI hay una Excepción existente con el idioma de ejecución o las bibliotecas, úsela ELSE cree la suya, documente bien y eso debería funcionar en el 99% de los casos.

11

Motivo uno:

Necesito atrapar cosas específicas. Si el código de llamada necesita tratar una condición excepcional específica, debe diferenciar su Excepción, y Java diferencia las excepciones con diferentes tipos, por lo que debe escribir la suya propia.

Básicamente, si alguien tiene que escribir:

catch(ExistingException e) { 
    if({condition}) { 
    { some stuff here} 
    } 
    else { 
    { different stuff here} 
    } 
} 

Es probable que desee escribir una extensión específica; catch La coincidencia de excepciones es más clara que la de condicionales, en mi humilde opinión.

Recuerde: su nueva Excepción puede haber una subclase de RuntimeException

Razón dos:

consolidación API. Si escribir una interfaz y tiene varias implementaciones, es posible que ellos llamarán diferentes APIs con un montón de diferentes no RuntimeExceptions tirado:

interface MyInterface { 
    void methodA(); 
} 

class MyImplA { 
    void methodA() throws SQLException { ... } 
} 

class MyImplB { 
    void methodA() throws IOException { ... } 
} 

Está seguro de querer MyInterface.methodA para lanzar excepción de SQL y IOException? Tal vez entonces tenga sentido ajustar las posibles excepciones en una Excepción personalizada. Que de nuevo puede ser una RuntimeException. O incluso RuntimeException en sí ...

0

Usaría las excepciones de la API de Java cuando la excepción se relaciona con la API. Pero si surge una situación excepcional que es exclusiva de mi propia API, entonces crearé una Excepción para ella. Por ejemplo, si tengo un objeto Range con dos propiedades min y max y el mínimo invariable < = max entonces crearé una excepción InvalidRangeException.

Cuando estoy escribiendo código, esto ayuda porque sé si la excepción se origina porque violé una de mis propias condiciones o algo de la API de Java.

8

creo que:

catch (Exception e) { 
    ... 
} 

... es un anti patrón que debe ser evitado. Es posible que desee una captura amplia centralizada en alguna parte de la aplicación, registrar un error y evitar que la aplicación final termine, pero tenerlos diseminados por doquier es malo.

qué:

try { 
    if(myShape.isHidden()) { 
     throw new Exception(); 
    } 
    // More logic 
} catch (Exception e) { 
    MyApp.notify("Can't munge a hidden shape"); 
} 

por lo que tratar de esto, y debido a un error de codificación, myShape es nulo. Se lanza una excepción NullPointerException cuando el tiempo de ejecución intenta desvincular myShape. Este código informa una forma oculta, cuando debería informar un puntero nulo.

Haga su propia excepción o busque una excepción especializada adecuada en la API. No es como si extender Exception o RuntimeException fuera oneroso.

+0

Puede hacer 'lanzar nueva excepción (" No se puede enviar una forma oculta "); ... MyApp.notify (e.getMessage()) '. Que es mucho más legible y manejable. – brice

+0

Eso está bien si lo único que quieres hacer es informar una cadena. ¿Qué pasaría si hubiera sido 'catch (Exception e) {unHideShape (myShape); } '? – slim

+0

Estoy seguro de que quise decir algo específico de ese comentario hace tres años, pero no tengo idea de qué :) Estoy de acuerdo con su opinión. +1 – brice

1

No puedo imaginar lanzar específicamente una java.lang.Exception si algún objeto/clase/método tuvo un problema. Es demasiado genérico: si no va a crear su propia clase de excepción, me parece que al menos debería haber un tipo de excepción más específico en la API.

4

El software captura el significado.

No hay casi ninguna razón para lanzar una excepción existente: la JVM ya lo hace por usted. Su versión de su excepción no es realmente precisa y arrojar "Excepción" tampoco es significativa.

Es posible que tenga un DataFormatException debido a un algoritmo de análisis que ha escrito. Esto, sin embargo, es raro.

Cuando su programa encuentra una situación excepcional, casi siempre es exclusivo de su programa. ¿Por qué adaptar su situación excepcional a una excepción existente? Si es exclusivo de tu programa, entonces ... bueno ... es único. Nómbralo de esa manera.

No obstante, no proporcione una clase de excepción única para cada mensaje único. Una excepción clase puede tener muchos mensajes variantes y detalles de soporte.

La regla de oro de Python, traducida a Java, es definir cualquier excepción única a nivel de paquete. [En Python, sugieren excepciones a nivel de "módulo", algo que no se traduce precisamente a Java.]

Cuestiones relacionadas