ИМХО Я предпочитаю более мягкий подход. Я создаю пользовательское исключение, которое я вызываю FatalException. https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions. Таким образом, когда я вызываю методы, которые вызывают FatalException, я просто делаю попытку для вызова и catch (FatalException fe). Я обычно повторно бросаю по мере необходимости, чтобы вернуться в родительскую форму, которая также имеет окончательный улов для исключения FatalException, а затем занести его в журнал (я использую Log4Net), показать окно сообщения о причине фатальной ситуации и вызвать мой переопределенный Dispose() и изящно выйти из приложения. Очевидно, это становится более сложным, чем глубже ваши вложенные звонки. Дополнительная работа заслуживает дополнительной грации. Если это станет стандартом в вашем приложении, вы поймете его, когда столкнетесь с ним и убедитесь, что его не сломаете. Я помещаю свои пользовательские исключения в библиотеку DLL. Если ваш код находится в библиотеке, этот подход по-прежнему работает, поскольку Исключения также находятся в библиотеке, которую они могут совместно использовать как с другой библиотекой, так и с основным приложением. Это означает, что ваша библиотека также может генерировать исключение FatalException, хотя причины для этого должны быть незначительными.
Не должно быть необработанного 'throw new Exception (« Преднамеренная ошибка »);' достаточно? – Lennart
Не понимаю. Что такое «CTD»? –
Crash to Desktop @ SonerGönül – Lennart