2010-04-13 14 views
9

Prefiero tener la lógica de manejo de excepciones más arriba en la pila de llamadas, cerca del método principal. Me gusta este enfoque ... Sin embargo, creé un hilo donde algunas de sus llamadas al método dentro de run() pueden arrojar excepciones. Realmente me gustaría ver si hay una forma de que estas excepciones puedan volver al subproceso principal. Lo mejor que pude pensar es establecer una variable dentro del objeto que implementa Runnable. Esta variable es una cadena que contiene el mensaje de error, que luego usa un cargador de clases para volver a crear correctamente la misma excepción en el hilo padre.Java: manejo de excepciones en hilos secundarios

Lo que me gustaría saber, ¿hay alguna manera menos complicada de obtener lo que quiero aquí? (para poder asegurarse de que cualquier excepción lanzada en un hilo secundario se maneje con la misma lógica de manejo de excepciones que si se ejecutara en la reutilización principal de hilo/código).

+0

Parece que esta pregunta se hace mucho aquí ... Consideraría cerrarla pero después de haber leído las otras un poco más, esta pregunta me pide algo diferente: está usando un cargador de clases + guardando la excepción en el objeto ejecutable viable ? – Zombies

+0

Aparentemente no es como lo indica Bill K. Gracias. – Zombies

Respuesta

3

Coja en el nivel externo de su método run() luego coloque la excepción en una variable en su Runnable y haga que Runnable indique que se completó.

El código que inició el ejecutable tiene que examinar Runnable para ver que el objeto "Excepción" está configurado y volver a lanzarlo o manejarlo.

Si volver a lanzar él, es posible que desee envolverlo en una nueva excepción:

throw new Exception(oldException); 

esto le dará ambos seguimientos de pila.

(Gracias Taylor L)

+1

Creo que fillInStackTrace reemplazará el marco de pila actual en lugar del marco de pila original de la excepción. No estoy seguro de que sea eso lo que querrías. Quizás sería mejor ajustar la excepción con una nueva como lanzar YourException (originalException) nueva. El resto parece bien sin embargo. –

+0

Oh jaja, por supuesto lol. No es necesario un cargador de clases complejo. – Zombies

26

Puede utilizar un ExecutorService aquí para presentar un exigible y recibir un futuro. En el punto en el que desea al menos desear que la Excepción se propague al hilo de invocación invocaría future.get()

future.get() propondrá cualquier excepción lanzada en el método de llamada al hilo que está invocando future.get(). Por lo tanto, si el hilo principal invoca future.get(), el hilo principal verá las excepciones lanzadas.

+1

Esto es genial! No sabía que fuera posible de esta manera. – pajton

+3

Futures es una de las características menos utilizadas en Java. Más de la mitad del uso directo de hilos que necesito se puede hacer de manera más segura, más fácil y más económica con Futures. –

+1

@James eres 100% correcto, incluso una barrera de sincronización simple es mucho más fácil con Futures que con el más conocido CountdownLatch y CyclicBarrier –

4

Con Thread.setUncaughtExceptionHandler() puede establecer Thread.UncaughtExceptionHandler en su Thread y tiene una lógica centralizada para manejar excepciones de sus hilos.

Además, puede escribir su propio ThreadFactory que le creará hilos con el preajuste Thread.UncaughtExceptionHandler.

+0

Creo que mi único problema es que 'Thread.UncaughtExceptionHandler' me obliga a manejar la excepción allí, pero quiero volver a subir algunas pilas hacia main(). – Zombies

+0

Gracias pajton por la propina! –