Chequeado contra excepciones no comprobadas

de dos frases Revisión

: excepciones A cuadros tienen que ser declarados en la firma del método y tratados por el código de llamada, controla, RuntimeExceptions no. El compilador Java hace cumplir esta norma con un error en tiempo de compilación

He estado disfrutando, «Java: las partes buenas.» Por Jim Waldo y acaba de terminar el capítulo 3: «. Excepciones» Al final del capítulo, el Sr. Waldo tiene una postura firme en contra de humor RuntimeExceptions. De hecho, RuntimeExceptions pueden ser mal utilizados maliciosamente. Sin embargo, creo que hay un tiempo y un lugar para estas excepciones. Saber cuándo usarlos requiere una comprensión de quién es la culpa de un problema en particular, y si el problema es recuperable o no

En el siguiente ejemplo de código me mordió el otro día:.

   / / EVIL - NUNCA HACER ESTO  
public static void write (String s) {
tratar
{out.write (s);
} catch class="keyword"> (IOException OIE) {
throw new IllegalStateException ();}

}

Es el mal (como el Sr. . Waldo dice) por varias razones:

  1. Este método no está siendo responsable de manejar sus propios problemas. IOExceptions pasan por buenas razones otros que los errores de codificación – los usuarios pueden borrar archivos, conexiones de red pueden cerrar, etc Mejor que esconde esta excepción a este método podría volver a intentar la escritura () o recuperarse de alguna otra manera. Si la recuperación no fuera práctica, este método haría mejor dejar que la excepción original suben a la persona que llama. Otra mejora podría ser que este informe método del error de alguna otra forma adecuada (por ejemplo para el usuario).
  2. Envolver una excepción comprobada con una RuntimeException significa que esta firma de método que falta información vital que la persona que llama realmente necesita conocer. . Oculta detalles críticos (cualquier problema con el write () ahora causa una excepción inesperada)
  3. Distraídamente envolver una excepción con otra excepción sólo sirve para complicar el seguimiento de la pila – se esconde aún más la causa del problema. Es bueno para envolver una excepción si usted tiene información crítica para agregar (por ejemplo, el método maneja dos corrientes y que envuelve una excepción con el mensaje de que se aplica a la corriente). En el ejemplo anterior, se añade nada. De hecho, este código no se ajusta una excepción, se tira a la basura y la sustituye por otra que es aún peor.
  4. El IllegalStateException está en blanco, dando a la desafortunada persona que llama ni idea de lo que salió mal.

A continuación se muestra el uso correcto de RuntimeExceptions:.

   / ** Crea o devuelve un objeto inmutable YearMonth existente 
@ años param un año válido
@ param mes al mes con base uno entre 1-12
@ return el objeto relevante YearMonth
* /

static YearMonth valueOf ( int años, int mes) {
si ((mes <1) | | (mes> 12)) {
new IllegalArgumentException ("El mes tiene ser un "+
" entero positivo tal que 0
...

Esto es bueno porque :.

  1. valores de entrada válidos se documentan claramente la persona que llama en el JavaDoc
  2. Las entradas se comprueba al principio del método, antes de realizar cualquier tratamiento, al fracaso rápido ya prueba de voz alta si la basura pasado.
  3. Arroja una RuntimeException informar a la persona que llama que que ha hecho un error de codificación.
  4. La excepción proporciona . información acerca de lo que la persona que llama que hizo mal

Usted no quiere usar una excepción comprobada porque obligaría código del interlocutor responsable de revisar sus valores de entrada dos veces:

  YearMonth ym; 
/ / Responsablemente comprobar las entradas antes de llamar a valueOf ()
si (m> 12) {
out.write ("Mes demasiado grande");}
else if (m <1) {
out.write ("Mes demasiado pequeño");}
demás
/ / Ya lo he comprobado mi insumos. ¿Por qué tengo que comprobar si hay una excepción
/ / también? Si lo hace, no me beneficia en modo alguno. Simplemente hace que el
/ / interface innecesariamente difícil de usar!

tratar
{ym = YearMonth.valueOf (y, m);
} catch class="keyword"> (Exception e) {
out.println ("mes todavía no válida:" + e.getMessage ());
}}

El matiz crítico aquí es que RuntimeExceptions deben usarse para indicar un error de programación por parte de la persona que llama de la función que lo tira. Se utilizan generalmente en las primeras líneas de la función como un cheque defensiva para los valores de entrada no válidos. Cada RuntimeException debe incluir una descripción del problema (no estar en blanco)

RuntimeExceptions también se puede utilizar para atrapar estado no válido de la siguiente manera:.

   enum  Numb {UNO, DOS;} 
privada Numb num = null;

public void init (Numb n) {
si (n == null) {
throw new IllegalArgumentException ("init no puede tener un valor nulo Numb");}

num = n;}


public void showNum () {
si (ONE == num) {
out.println (" 1 ");
} else if (DOS num ==) {
out.println ("2");}
más
IllegalStateException ("valor no controlada de Numb o llamado" +
"showNum sin inicializar el" +
"num");}

}

Cuando algún programador agrega tres para adormecer y no tiene en cuenta el nuevo valor posible, no duro y rápido , por lo que el problema es fácil de encontrar y corregir.

RuntimeExceptions son una buena manera de hacer que el código falla duro y rápido sin forzar la persona que llama para comprobar sus valores de entrada dos veces. Si se usa adecuadamente pueden hacer errores de codificación furtivos obvio. Se utiliza de forma incorrecta, pueden hacer y los errores manifiestos furtivo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *