If you ever use do multi-threaded programming and use Control.Invoke to invoke a method on GUI Thread, you might experience this problem before. You throw an exception with the hope that ThreadException will get it but wrong. It won't get it as the method Control.Invoke will actually catch the exception and then serialize it and throw it back in the calling thread. This is annoying since you expect to use ThreadException to handle it.