2011-07-12 10 views
21

Supongamos que un hilo se inicia desde el método principal. ¿Qué sucede si se lanza una excepción en el hilo pero no se maneja dentro del hilo?excepciones de hilos de java

¿Es posible propagar la excepción al método principal?

Respuesta

32

Estamos hablando de excepciones sin marcar lanzadas desde el método Thread.run. Por defecto, recibirá algo como esto en error del sistema:

Exception in thread "Thread-0" java.lang.RuntimeException 
    at Main$1.run(Main.java:11) 
    at java.lang.Thread.run(Thread.java:619) 

Este es el resultado de printStackTrace de excepciones no controladas. Para manejarlo, puede añadir su UncaughtExceptionHandler:

Thread t = new Thread(new Runnable(){ 
     public void run() { 
      throw new RuntimeException(); 
     }  
    }); 
    t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("exception " + e + " from thread " + t); 
     } 
    }); 
    t.start(); 

Para configurar controlador para todos los hilos utilizan un método estático Thread.setDefaultUncaughtExceptionHandler.

0

Si la excepción no es manejada por try {} catch (Exception e){}, entonces se levanta y se lanza a la función que llamó.

Si se trata de hilo independiente separada, que no se puede propagar a objeto que no es el padre de la rosca

o alguna otra información aquí: How to throw a checked exception from a java thread?

0

Normalmente, si no se implementan las excepciones a sí mismo, cuando ocurre alguna excepción, cierra la ejecución.

+0

Solo del hilo en el que se produce –

3

No, no puede. Cuando lo piensas, el método main() pudo haber terminado hace días.

Cualquier excepción no detectada de un hilo se propaga a la cadena UncaughtExceptionHandler. Si no hay ninguno definido, va al manejador del grupo de hilos, si eso no está configurado, va al manejador predeterminado.

+0

La primera línea en su respuesta sobre "días atrás" fue útil para comprender mejor el problema. En efecto, múltiples hilos pueden actuar como procesos separados que pasan a compartir (fácilmente) los datos. El mismo modelo exacto se puede construir (con algunos problemas) utilizando procesos separados y memoria compartida. – kevinarpe

0

La excepción la captura el UncaughtExceptionHandler. Puede atraparlo allí y propagarlo nuevamente al hilo principal si lo desea.

5

Si la excepción es capturada y manejada por el código que se ejecuta en esa secuencia, se manejará, sin embargo, se escribirá la lógica de bloque catch. Asumiré por el resto de esta respuesta que estás hablando de excepciones no detectadas.

Una excepción no detectada hará que el hilo salga. Cuando burbujea en la parte superior de Thread.run(), será manejado por Thread's UncaughtExceptionHandler. Por defecto, esto simplemente imprimirá el seguimiento de la pila a la consola. El hilo en sí saldrá en este punto; no podría continuar de todos modos, porque su método run() ha finalizado.

Así que si quieres que la excepción se vuelva a subir en tu hilo principal, puedes definir un UncaughtExceptionHandler que hará esto (es una interfaz muy simple), y luego llamar al Thread.setUncaughtExceptionHandler en el hilo engendrado después de haber sido creado, pasando tu manejador de excepciones personalizado.


La única parte potencialmente complicado de escribir el manejador es determinar dónde y cómo es exactamente lo que vamos a "insertar" el throwable en el hilo principal. Esto no es completamente obvio, si su hilo está desactivado haciendo otra cosa, y dependerá mucho de cómo haya diseñado su aplicación y de cómo se ve su soporte simultáneo.

(Si, por otro lado, el hilo principal está esperando a que se ejecute el otro hilo, entonces se vuelve más fácil. Pero en este caso, tal vez su hilo principal debe enviar una tarea a un ExecutorService y bloqueo en a Future, que manejará todas estas cosas de cableado/ciclo de vida para usted?)