У меня есть рекурсивный вызов метода, который вызывает исключение переполнения стека. Первый вызов окружен блоком try catch, но исключение не перехватывается.
Исключение переполнения стека ведет себя особым образом? Могу ли я правильно поймать / обработать исключение?
Не уверен, если актуально, но дополнительная информация:
исключение не создается в основном потоке
объект, в котором код генерирует исключение, загружается вручную с помощью Assembly.LoadFrom (...). CreateInstance (...)
Assert.Fail
вместо этого. Итак, серьезно - как мы это делаем?Ответы:
Начиная с версии 2.0 исключение StackOverflow может быть обнаружено только в следующих случаях.
* «размещенная среда», например «мой код размещает CLR, и я настраиваю параметры CLR», а не «мой код работает на общем хостинге»
источник
Starting with 2.0 ...
Мне любопытно, что им мешает поймать ТАК и как это было возможно1.1
(вы упомянули об этом в своем комментарии)?Правильный способ - исправить перелив, но ....
Вы можете увеличить стек: -
Вы можете использовать свойство System.Diagnostics.StackTrace FrameCount, чтобы подсчитать использованные кадры и выдать собственное исключение при достижении предела кадров.
Или вы можете рассчитать размер оставшегося стека и выбросить собственное исключение, когда оно упадет ниже порога: -
Просто поймай Сыр. ;)
источник
Cheese
далеко не конкретный. Я бы пошел наthrow new CheeseException("Gouda");
На странице MSDN в StackOverflowException s:
источник
Как уже сказали несколько пользователей, исключение не уловишь. Однако, если вы изо всех сил пытаетесь выяснить, где это происходит, вы можете настроить Visual Studio, чтобы она ломалась, когда ее бросают.
Для этого вам нужно открыть настройки исключений из меню «Отладка». В более старых версиях Visual Studio это «Отладка» - «Исключения»; в более новых версиях это «Отладка» - «Windows» - «Настройки исключений».
После открытия настроек разверните «Исключения среды CLR», разверните «Система», прокрутите вниз и отметьте «System.StackOverflowException». Затем вы можете посмотреть стек вызовов и найти повторяющийся образец вызовов. Это должно дать вам представление о том, где искать, чтобы исправить код, вызывающий переполнение стека.
источник
Как упоминалось выше несколько раз, невозможно перехватить StackOverflowException, которое было вызвано Системой из-за поврежденного состояния процесса. Но есть способ заметить исключение как событие:
Тем не менее, ваше приложение будет завершено после выхода из функции события (ОЧЕНЬ грязный обходной путь заключался в перезапуске приложения в этом событии, ха-ха, этого не было и никогда не будет). Но для регистрации вполне достаточно!
источник
Да из CLR 2.0 переполнение стека считается неустранимой ситуацией. Таким образом, среда выполнения по-прежнему завершает процесс.
Подробнее см. В документации http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx
источник
StackOverflowException
по умолчанию завершает процесс.Вы не можете. CLR вам не позволит. Переполнение стека является фатальной ошибкой и не может быть исправлено.
источник
Вы не можете, поскольку большинство сообщений объясняют, позвольте мне добавить еще одну область:
На многих веб-сайтах вы найдете людей, говорящих, что способ избежать этого - использовать другой домен приложения, поэтому, если это произойдет, домен будет выгружен. Это абсолютно неверно (если вы не размещаете свою среду CLR), поскольку поведение среды CLR по умолчанию вызовет событие KillProcess, что приведет к отключению вашего домена приложения по умолчанию.
источник
Это невозможно, и по уважительной причине (например, подумайте обо всех этих уловках (Exception) {} вокруг).
Если вы хотите продолжить выполнение после переполнения стека, запустите опасный код в другом домене приложений. Политики CLR могут быть настроены на завершение работы текущего домена приложения при переполнении, не затрагивая исходный домен.
источник