2010-03-18 18 views
16

Tengo un método que toma una enumeración como parámetro y devuelve cierta información que depende de ese parámetro. Sin embargo, esa enumeración contiene algunos valores que no deberían manejarse, y debería generar una condición de error. Actualmente, el método arroja una IllegalArgumentException, pero me gustaría que fuera una excepción comprobada para obligar a las personas que llaman a atraparla (y regresar con gracia, registrando un error). ¿Hay algo adecuado o debería crear mi propia subclase Exception?equivalente comprobado a IllegalArgumentException?

Estoy abierto a otros patrones también. Una reacción razonable sería que se deben manejar todos los valores de la enumeración, pero ese no es el caso. Cuando se agrega un nuevo valor a la enumeración, quiero asegurarme de que este método haga lo correcto: alertar a un ser humano es preferible a usar algún valor de retorno predeterminado en este caso.

Gracias por cualquier consejo.

Respuesta

3

Las preguntas son:

  • la forma "normal" son casos en los que el método se llama con un parámetro de enumeración no es convenible?
  • ¿Puedes manejar estos casos con elegancia y luego continuar el proceso?

Según lo que describes, no es "normal" (solo ocurre cuando se agrega un nuevo valor enum y el método no se actualiza correctamente, es decir, cuando se introdujo un error). Entonces, para mí esto suena más como un caso para RuntimeException (es decir, sin marcar). Las personas que llaman de este método todavía pueden atrapar una excepción no verificada si realmente lo desean, pero no están obligados a hacerlo.

OTOH Intentaré eliminar el caso que describes, moviendo los datos que tu método está devolviendo dentro de la enumeración. De esta forma, cada vez que se agrega un nuevo valor enum, no hay manera de que los datos relevantes puedan olvidarse.

Si está interesado, es posible que desee comprobar this tutorial.

4

Ciertamente puede crear una excepción marcada propia (como UnhandledEnumType), o podría atrapar y manejar la IllegalArgumentException. Suena un poco sospechoso que solo se deben manejar algunos valores de la enumeración. Uno de los propósitos de una enumeración es vincular los valores a un determinado conjunto de valores, y esperaría que todo se manejara. Si le preocupa que se agreguen nuevas, debe hacerse una prueba que pruebe que todos los valores se manejan correctamente (utilizando el método de valores() de la enumeración para asegurarse de que se prueban todos).

+1

Aparece la pregunta principalmente sobre cómo forzar el manejo de un argumento ilegal (independientemente de si es una enumeración). No tiene que atrapar o declarar excepciones _unchecked_, como 'IllegalArgumentException'. Esta respuesta sugiere crear o reutilizar una excepción _checked_ existente, que el compilador aplicará. Esta es la forma en que la mayoría de las personas lo abordan. –

0

¿Qué tal la InstantiationException? Lanzado cuando una aplicación intenta crear una instancia de una clase utilizando el método newInstance en la clase Class, pero no se puede crear una instancia del objeto de clase especificado. La creación de instancias puede fallar por una variedad de razones que incluyen pero no se limitan a: el objeto de clase representa una clase abstracta, una interfaz, una clase de matriz, un tipo primitivo o nula la clase no tiene constructor nullary

Cuestiones relacionadas