Try / Catch and threading

Вы можете преобразовать в одну строку:

public static LocalDate getLocalDateFromDate(Date date){
   return LocalDate.from(Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()));
}
13
задан Otávio Décio 22 April 2009 в 17:57
поделиться

5 ответов

Well in general, you've no idea where the originating thread will be by the time the exception is thrown in the new thread - why would it be waiting around for the thread to throw an exception?

Think of the stacks involved - when an exception is thrown, it goes up the stack until it reaches an appropriate catch block. The new thread has a completely separate stack to the creating thread, so it'll never reach the catch block in the creating thread's stack.

EDIT: Of course, you could design your system so that the creating thread did wait for other things to happen - a bit like the message loop in a Windows Forms application. The new thread could then catch the exception and send a message to the creating thread, which could then deal with the exception. That isn't the normal setup though - you have to do it all explicitly.

28
ответ дан 1 December 2019 в 19:23
поделиться

Возможно, вы захотите использовать оболочку EventGeneratingThread - это позволит вам отлавливать и обрабатывать исключения, создаваемые в потоках процесса, который их породил.

2
ответ дан 1 December 2019 в 19:23
поделиться

Это плохая идея делать предположения, особенно когда задействованы несколько потоков (вы знаете эту старую поговорку).

Почему будет код, который запустил поток, смотрите исключение? Код, который запустил поток, может даже не существовать, когда генерируется исключение.

2
ответ дан 1 December 2019 в 19:23
поделиться

Работающий поток не будет перехвачен в вашем операторе try / catch, поскольку он выполняется в другом потоке. Try / Catch работает только для текущего потока. То, что вам нужно сделать, - это попробовать / перехватить функцию, выполняемую потоком, и каким-то образом управлять тем, что происходит в случае сбоя.

2
ответ дан 1 December 2019 в 19:23
поделиться

Попробуйте добавить это перед вашим DoWork Sub

<System.Diagnostics.DebuggerNonUserCodeAttribute()> _

Я использую фоновый воркер, и все Try Catch в моем цикле работают так, как вы ожидаете от этого.

2
ответ дан 1 December 2019 в 19:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: