2014-10-17 4 views
2

Мне нужно создать фатальное исключение по требованию, используя C#. Хотя я сделал это непреднамеренно достаточно времени, теперь мне нужно, я не могу найти простой способ.Умышленно вызывать фатальное исключение

Достаточно легко вызвать нулевую опорную ошибку или делить на ноль и т. Д., Но мне нужно что-то, что будет CTD без предоставления возможности продолжить.

Благодарим за помощь.

+6

Не должно быть необработанного 'throw new Exception (« Преднамеренная ошибка »);' достаточно? – Lennart

+1

Не понимаю. Что такое «CTD»? –

+1

Crash to Desktop @ SonerGönül – Lennart

ответ

9

Не используйте исключение, чтобы выполнить это, у него слишком много побочных эффектов. Включение вообще не завершение программы, независимо от того, закончилось ли необработанное исключение, программа представляет собой политику CLR, которая может быть изменена. Как пользовательский хост CLR, так и ранее отображаемый атрибутом конфигурации legacyUnhandledExceptionPolicy.

Самый надежный способ мгновенно прервать программу, без каких-либо увольнений и без какой-либо очистки (включая не запущенные финализаторы) - Environment.FailFast().

+0

Отлично, спасибо :) – Panjo

+0

Это приводит к сбою моего тестового проводника в Visual Studio 2013; «vstest.executionengine.clr20.exe перестает работать» и «Активный тестовый прогон был прерван, потому что процесс выполнения неожиданно вышел из строя. Проверьте журналы процессов выполнения для получения дополнительной информации. Если журналы не включены, включите журналы и повторите попытку . ". Исключение в этом случае выглядит более мягким. –

0

ИМХО Я предпочитаю более мягкий подход. Я создаю пользовательское исключение, которое я вызываю 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, хотя причины для этого должны быть незначительными.

Смежные вопросы