Намеренно вызвать фатальное исключение

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

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

Спасибо за вашу помощь.


person Panjo    schedule 17.10.2014    source источник
comment
Разве необработанного throw new Exception("Intentional error"); не должно быть достаточно?   -  person Lennart    schedule 17.10.2014
comment
Я не понимаю. Что такое CTD?   -  person Soner Gönül    schedule 17.10.2014
comment
Сбой на рабочем столе @SonerGönül   -  person Lennart    schedule 17.10.2014
comment
Не спускайте глаз с мяча, вас интересует конечный результат, а не способ его достижения. Просто вызовите Environment.FailFast().   -  person Hans Passant    schedule 17.10.2014
comment
Интересно, не знал об этом! @ХансПассант   -  person Lennart    schedule 17.10.2014
comment
@HansPassant Я тоже, опубликуй это как ответ!   -  person helb    schedule 17.10.2014
comment
Спасибо всем - и спасибо @HansPassant, это сработало блестяще (я приму, если вы опубликуете в качестве ответа).   -  person Panjo    schedule 17.10.2014
comment
@CodeCaster Я не согласен, что это дубликат представленного вопроса, плюс этот ответ более полезен.   -  person Panjo    schedule 17.10.2014
comment
Я проголосовал близко, потому что это question отвечает на ваш неявный вопрос Почему он дает возможность продолжить?. Если вы последуете совету в этом ответе, у вас не будет возможности продолжить. Если Ганс захочет, он может снова открыть это и ответить на него, но я думаю, что ему лучше обновить свой ответ там, чтобы хранить всю информацию о создании и обработке исключений такого рода в одном месте.   -  person CodeCaster    schedule 17.10.2014


Ответы (2)


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

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

person Hans Passant    schedule 17.10.2014
comment
Однако это приводит к сбою моего обозревателя тестов в Visual Studio 2013; vstest.executionengine.clr20.exe перестал работать, и активный тестовый прогон был прерван из-за неожиданного завершения процесса выполнения. Дополнительные сведения см. в журналах процесса выполнения. Если журналы не включены, то включите журналы и повторите попытку. Исключение в этом случае выглядит более мягким. - person Ruud van Gaal; 11.05.2017

ИМХО, я предпочитаю более мягкий подход. Я создаю собственное исключение, которое я называю FatalException. https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions. Таким образом, когда я вызываю методы, которые генерируют FatalException, я просто делаю try-catch вокруг вызова и перехватываю (FatalException fe). Я обычно повторно выбрасываю по мере необходимости, чтобы вернуться к родительской форме, которая также имеет окончательный улов для исключения FatalException, а затем регистрирую его (я использую Log4Net), показываю окно сообщения о причине фатальной ситуации и вызываю мой переопределенный Dispose () и корректно выйти из приложения. Очевидно, что это становится более сложным, чем глубже ваши вложенные вызовы. Дополнительная работа стоит дополнительной благодати для меня. Если это станет стандартом в вашем приложении, вы поймете это, когда столкнетесь с этим, и позаботитесь о том, чтобы не нарушить его. Я поместил свои пользовательские исключения в библиотеку DLL. Если ваш код находится в библиотеке, этот подход все еще работает, потому что исключения также находятся в библиотеке, они могут использоваться как другой библиотекой, так и основным приложением. Это означает, что ваша библиотека также может генерировать FatalException, хотя причин для этого должно быть несколько.

person Al C.    schedule 13.09.2017