wWinmain, Unicode и Mingw

Я работаю над изучением Windows API и использую mingw в качестве моего компилятора с Code :: Blocks в качестве моей IDE. Я столкнулся с проблемой с использованием функции wWinMain. Я использовал программу, расположенную здесь текст ссылки . Он прекрасно компилируется в VSC ++ 2008 express, но при использовании mingw я получаюWinMain @ 16

Я написал код, чтобы попытаться перехватить StackOverFlowExceptions:

try { recursiveFxn(100000); }
catch(Exception){}
private void recursiveFxn(int countdown)
{
if (countdown > 0)
    recursiveFxn(countdown - 1);
else
    throw new Exception("lol.  Forced exception.");
}

Но все равно я получаю сбои программы (как в NUnit, так и на веб-странице, на которой я работаю). Почему не ловится исключение?

10
задан user420667 26 August 2010 в 00:29
поделиться

2 ответа

Начиная с .NET Framework 2.0 StackOverflowException невозможно перехватить. Это потому, что это считается плохой практикой. Цитата из документации MSDN:

Начиная с .NET Framework версия 2.0, исключение StackOverflowException объект не может быть пойман с помощью try-catch блок и соответствующий процесс прекращено по умолчанию. Следовательно, пользователям рекомендуется писать свой код для обнаружения и предотвращения стека переполнение. Например, если ваш приложение зависит от рекурсии, используйте счетчик или условие состояния для завершить рекурсивный цикл.

Теперь единственный способ поймать StackOverflowException — это когда оно было вызвано кодом пользователя, как описано в блоге Джареда Парсонса. Помимо этого, размещая CLR, вы можете обрабатывать (но не перехватывать) StackOverflowException и разрабатывать способ продолжения выполнения вашей программы.

Обратите внимание: поскольку стек раскручивается при возникновении исключения, в версиях .Net до версии 2.0 стек на самом деле был бы намного короче при обработке StackOverflowException, что позволяло делать это без генерации другое StackOverflowException.

16
ответ дан 3 December 2019 в 22:34
поделиться

Вы не можете поймать исключение переполнения стека, потому что, когда оно происходит, оно уничтожает поток. Try... catch... выполняется тем же потоком, так что это не сработает. Могут быть некоторые API более низкого уровня, которые вы могли бы P/Invoke и перехватить другим потоком. Также могут быть некоторые API более низкого уровня для изменения максимального размера стека, но я не вижу ничего в .NET Framework, чтобы помочь с этим, поэтому вам снова нужно будет что-то P/Invoke.

-1
ответ дан 3 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: