Strictly from the logical point of view catching C++ exceptions in threads different than the ones they originate from wouldn't make sense. I'm not sure if it would make sense even with Java exceptions...

You have two different flows which may be at arbitrary points during the exception and you want one of them (the outer one) to jump completely elsewhere (to the "catch" block) and then what? go back? Continue after the catch block?

run() is an asynchronous call - the calling thread continues execution. From what I see it is only possible to catch transferred exceptions thrown by the four methods mentioned at the end of the reference section you mention when using QFuture (and run() uses one). Other exceptions won't be caught properly. So either use a blocking call or don't use exceptions (but signals and slots or events, for example).