2013-07-04 3 views
1

Я код, который выглядит следующим образом:Как повторно сгенерирует исключение, чтобы поймать-блок в другом потоке

public static void startService() { 
      try{ 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        throw new RuntimeException("Some exception"); 
       } 
      }).start(); 
      }catch (Exception e){ 
       //Exception handling 
      } 
     } 

Как я могу обработать это исключение в улове() блока в parrent потоке? UPD: Это потоки должны работать асинхронно

+0

Взгляните на http://stackoverflow.com/questions/2631791/java-handling-exceptions-in-child-threads – adarshr

+0

Нужно понимать, что 'new Thread()' и '.start()' являются вероятно, не приведет к исключению. Затем запускается параллельный поток и вызывается 'run'. С помощью обработчика исключений вы можете быть проинформированы. –

ответ

0

Повторное выбрасывание исключение, просто добавляя throw e в catch блоке

+0

downvote означает, что я ошибся в объяснении темы, не могли бы вы сообщить мне? –

+0

, чтобы восстановить повреждение, другие люди также получили downvotes без объяснения причин – morgano

+0

@morgano, мне тоже :) –

-1

Используйте бросок заявление в блоке поймать.

public static void startService() { 
     try{ 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 

      } 
     }).start(); 
     }catch (Exception e){ 
      throw e; 
    } 
} 
+0

Я думаю, вопрос в том, как я могу перестроить исключение, созданное дочерним потоком из родительского потока. – assylias

2

У вас есть несколько вариантов обработки исключений, создаваемых потоками. Одна из них имеет общий неперехваченное исключения обработчика:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread t, Throwable e) { 
     //log the exception or handle it here if possible 
    } 
}); 

Но это трудно связать исключение поймано, что путь с конкретным потоком.

Или вы можете использовать ExecutorService вместо запуска нити вручную:

ExecutorService executor = Executors.newCachedThreadPool(); 
Future<?> future = executor.submit(new Runnable() { 
    @Override 
    public void run() { 
     throw new RuntimeException("Some exception"); 
    } 
}); 

try { 
    future.get(); 
} catch (ExecutionException e) { 
    Throwable yourException = e.getCause(); //here you can access the exception 
} 
+0

Прошу прощения, я не упоминал, что мне нужно сделать это асинхронно. И метод get() является синхронным. –

+0

отличный ответ! – Multithreader

+1

Все в порядке, вы можете запустить метод get() в своем потоке, а затем зарегистрировать прослушиватель – Multithreader

0

Если вы имеете в виду, что внутри пробега Runnable по методу(), то вам придется использовать другой подход. Вместо этого используйте Callable! Метод callable call() позволяет вернуть значение и выдать исключение.

Пожалуйста, посмотрите здесь, как использовать Callable. Также обратите внимание, что лучше использовать api более высокого уровня, например ExecutorService, который управляет жизненным циклом ваших потоков и обеспечивает объединение потоков. (включенный в пример)

0

вам придется использовать Callable.

Метод thread.run никогда не будет генерировать исключение, поскольку он - хорошо выполнен в другом потоке и в этом не будет мешать вашему вызывающему потоку.

Если вы выполняете вызываемый (например, запускаете его через ExecutorService), вы получаете результат Future, который, в свою очередь, будет вызывать данное исключение при вызове метода future.get().

Смежные вопросы