This is not to hard to understand. Let's think.
Each thread works in its own stack. Exceptions also work on stack: the thrown exception is propagated to the point of the nearest try statement "back in time" on the same thread (
thread unwinding). Therefore you need to catch all exceptions on the top of the stack of each thread, to avoid uncontrolled termination of threads. At the same time, it's very important not to overdue catching exceptions; as a matter or rule, an exception should never be caught at the level where there is not specific exception handling for the type of exception being caught. It's equally important not to block propagation of exception. There are relatively rare exclusions from this rule, mostly as a work-around of some "bad" code inaccessible for patching.
Please see more detail in my past answers on the topic:
How do i make a loop that will stop when a scrollbar reaches the bottom[
^],
When i run an application an exception is caught how to handle this?[
^],
throw . .then ... rethrowing[
^].
—SA