Ваш код работает нормально, я не могу придумать много возможных сбоев. За исключением одного, существует проблема во взаимодействии между отладчиком и Windows SEH при отладке 32-разрядного кода в 64-разрядной операционной системе до Windows 8. Это может привести к проглатыванию исключений без какой-либо диагностики когда они происходят в событии Load формы или переопределении метода OnLoad (). Проверьте связанный пост на наличие обходных путей, самый простой - Project + Properties, вкладка Build, Platform Target = AnyCPU, снимите флажок «Предпочитать 32-битный», если вы его видите.
Как правило, вы делаете соответствующую вещь, не позволяя обработке исключений по умолчанию для Application.ThreadException отображать диалоговое окно. Но будь проще, делай так:
#if (!DEBUG)
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
#endif
Теперь вам больше не нужно беспокоиться о ThreadException, все исключения вызывают обработчик события AppDomain.UnhandledException. И #if вокруг кода все еще позволяет вам отлаживать необработанное исключение, отладчик автоматически остановится, когда возникнет исключение.
Добавьте это к методу UnhandledException, чтобы предотвратить отображение уведомления о сбое Windows:
Environment.Exit(1);