В отличие от C / C ++, main () - это не совсем все приложение. Таким образом, даже окружение всего кода в main () блоком try / catch не будет перехватывать все исключения, сгенерированные этим кодом.
Однако вы можете прикрепить функцию для обработки необработанных исключений, генерируемых всем приложением, прослушивая событие Application.ThreadException, которое поможет вам перехватывать исключения из любого потока в приложении, независимо от того, было ли оно создано вашим кодом или нет .
Например, ваш код может вызывать код во внешней неуправляемой DLL. Этот код может выполнять собственные потоки, которые могут асинхронно завершаться сбоем, вызывая исключение. Это исключение относится к процессу, который является вашим приложением, но не к какому-либо из вашего кода. И если не получится, ваша программа неожиданно прекратит работу.