viernes, 22 de mayo de 2015

Manejo de excepciones en hilos

Recientemente he tenido que trabajar con hilos y un posible problema, es el lanzamiento de excepciones no controladas y por tanto la detención de la ejecución del hilo.

Para evitar estos problemas esta la interfaz UncaughtExceptionHandler, la cual nos permite implementarla e implementar su método uncaughtException, en el cual podemos realizar la lógica pertienente en caso de error no controlado. Se ve más claro en un ejemplo sencillo.

Por un lado tenemos el hilo, el cual puede que en determinadas ocasiones lance un tipo de excepción no controlada.

public class PruebaThread extends Thread {
 private int numHilo;
 public PruebaThread(int numero){
  super();
  numHilo = numero;
 }
 public void run() {
  Random rand = new Random();
  int randomNum = rand.nextInt(3);
  System.out.println("NumHilo: "+numHilo+" tiene randomNum: "+randomNum);
  if (randomNum == 0) {
   throw new NullPointerException();
  } else if (randomNum == 1) {
   throw new ArithmeticException();
  } else if (randomNum == 2) {
   throw new IllegalArgumentException();
  }
 }
}

Por otro lado implementamos la interfaz y controlamos estas posibles excepciones, para cada una de ellas es posible que queramos realizar un tratamiento distinto.

import java.lang.Thread.UncaughtExceptionHandler;

public class PruebaUncaughtExceptionHandler implements UncaughtExceptionHandler{
 @Override
 public void uncaughtException(Thread t, Throwable e) {
  if(e instanceof NullPointerException){
   System.out.println("Es NullPointerException");
  }else if(e instanceof ArithmeticException){
   System.out.println("Es ArithmeticException");
  }else if(e instanceof IllegalArgumentException){
   System.out.println("Es IllegalArgumentException");
  }
 }
}

Si ejecutamos el siguiente código podemos ver como es el funcionamiento de los hilos y su tratamiento de excepciones

public static void main(String[] args) {
  for (int i = 0; i < 8; i++) {
   PruebaThread thread = new PruebaThread(i);
   thread.setUncaughtExceptionHandler(new PruebaUncaughtExceptionHandler());
   thread.start();
  }
 }

Resultado:

NumHilo: 3 tiene randomNum: 1
Es ArithmeticException
NumHilo: 2 tiene randomNum: 1
Es ArithmeticException
NumHilo: 5 tiene randomNum: 1
Es ArithmeticException
NumHilo: 1 tiene randomNum: 2
Es IllegalArgumentException
NumHilo: 0 tiene randomNum: 2
Es IllegalArgumentException
NumHilo: 4 tiene randomNum: 0
Es NullPointerException
NumHilo: 6 tiene randomNum: 0
Es NullPointerException
NumHilo: 7 tiene randomNum: 1
Es ArithmeticException

No hay comentarios:

Publicar un comentario