Dispatcher.Invoke() will setup a catch block so that it can marshal any exception back to the thread that called it. So that the caller knows that the Invoke() return value is not available. This catch block prevents the debugger from automatically breaking when the exception is thrown. The original exception is delivered as the InnerException of the TargetInvocationException object. Which might be good enough to diagnose the reason.
Do consider using BeginInvoke() instead, it doesn't need to do this kind of marshaling since the code that called it is no longer active. It is also a lot less prone to deadlock.
But if you really need the return value then only Invoke() can supply it. The way to debug an exception then is to use Debug + Exceptions and tick the Thrown checkbox for CLR exceptions. Which forces the debugger to stop when the exception is thrown.