2011-08-28 33 views
19

Estoy trabajando con una API que dice que es verdadera si tiene éxito y falsa si falla. Pero, también afirma lanzar excepciones diferentes si falla. ¿Cómo puede devolver falso y lanzar una excepción?¿Devuelve un valor Y lanza una excepción?

Respuesta

25

No es posible arrojar una excepción y devolver un valor desde una sola llamada a función.

Quizás haga algo así como devolver false si hay un error, pero lanzar una excepción si la entrada no es válida.

edición: PaulPRO registró una respuesta (ahora suprimido) señalando que es técnicamente posible hacer una excepción a ser lanzado en un hilo diferente, mientras que devolver un valor en el actual. Pensé que esto era digno de mención, incluso si no es algo que nunca deberías ver.

+0

Eso es lo que pensé. Aunque pensé que podría haber algún truco con un bloqueo final. – mark

+0

una vez que se produce una excepción, su programa deja de ejecutarse, por lo que es imposible hacer ambas cosas. Me pregunto si tienes una declaración de devolución en tu bloque de "prueba", ¿el programa aún pasa el bloque "final", porque si devolvieras un valor en el bloque de prueba y pusieras una Excepción de lanzamientos en el bloque Final lo harías? He hecho ambas cosas ... –

+2

@ Karel-Jan Misseghers: no, en Java su programa ** DEFINITIVAMENTE NO ** deja de funcionar una vez que se lanza una excepción. No está seguro de cómo funcionan las excepciones de Java y, obviamente, aún no ha realizado ninguna programación de Java multiproceso. Puede tener muchos subprocesos que funcionan sin problemas cuando ocurre una excepción sin marcar en otro subproceso. Hay muchos casos en que el hilo que se está muriendo se reinicia automáticamente (el más famoso es el EDT de Swing en algunos OS/JVM: si el EDT muere, se reinicia un nuevo EDT). – SyntaxT3rr0r

14

Usted puede lanzar una excepción que tiene una (en este caso booleano) Valor:

public class ValueException extends Exception { 
    final boolean value; 

    public ValueException(boolean value, String message) { 
     super(message); 
     this.value = value; 
    } 

    public boolean getValue() { 
     return value; 
    } 
} 
0

Si bien es posible escribir el código de una manera tal que una excepción y un valor se pueden derivar desde una llamada de función (ver las publicaciones anteriores), NUNCA se debe hacer con la codificación adecuada.

Me gustaría ver un enlace a la documentación de esta API. Las API deben dar prioridad a la claridad. Lanzar una excepción y devolver un valor deja la pregunta de si el valor que se devuelve es seguro de usar o si no es válido.

Recuerde, los bloques try/catch son el OTRO método para manejar excepciones. No pasan la excepción al método de llamada, pero lo manejan internamente de una manera que el desarrollador considere apropiado.

Si, para la depuración, necesita ver el valor resultante en el caso de una excepción, entonces la idea de Bohemian funciona bien.

Cuestiones relacionadas