Pull to refresh

Comments 10

На самом деле и правильно, что не стоит ловить переполнение стека, но вот когда я учил .Net и при запуске юнит-тестов всплыла неявная рекурсия и весь тестовый движок полетел в "Windows ищет способ исправления проблемы" без рапорта, что и где, было обидно. В противовес JVM, где исключение хоть так же нет причин ловить, тестовые фреймворки не ложатся под его весом, а честно сообщают об упавшем тесте и идут дальше работать.

Самому стало любопытно — проверил. Решарпер успешно поймал исключение и выдал ошибку «Stack overflow exception occurred in test. Test run is aborted.». Если запускал в Test Explorer самой студии (Visual Studio 2015 Enterprise), она тоже удачно справилась и выдала в Output «The test execution process crashed while running the tests.», предложив подебажить с файлом .dmp

Прошу прощения, я вас не понял — Решарпер смог дальше тесты запускать или как? Из ваших слов вижак успешно упал, что для меня не очень ожидаемое поведение.

Запустил сессию с двумя тестами. В первом — вызов бесконечной рекурсии. Появляется MessageBox с ошибкой «Stack overflow exception occurred in test. Test run is aborted.», соответственно по нему статус Aborted, по второму тесту — Inconclusive (то есть текущая сессия не продолжается). Ничего не упало, решарпер и студия работают стабильно.
Все-таки он не «успешно упал», а «успешно поймал» (catch) =)

А, уже лучше, чем было у меня, но всё равное такое ИМХО. Stacktrace был?

Нет, стэктрейса не было… но как-то сомневаюсь, что выводить его разумно в случае ухода в бесконечную рекурсию — это ж какой объем у него будет. Если по умолчанию максимальный размер стека в 64-битной системе 4 МБ (или 1 МБ для 32-битной системы), и весь этот объем — повторяющийся вызов одной и той же функции.
Тем не менее, в сессии видно, какой именно из тестов упал, в сообщении явно указано про Stack overflow exception — что скорее всего подразумевает рекурсию. В большинстве случаев, на мой взгляд, этого вполне достаточно, чтобы локализовать проблему. Если нет — то видимо, есть проблемы с архитектурой в целом, ИМХО.

С одной стороны да, а с другой показать дно стека было бы удобно. Это не вопрос архитектуры, скорее насколько платформа помогает искать лажу.

В защиту Решарпера могу сказать, что он подсвечивает сбоку рекурсивный вызов:
Recursive call


Кроме того, при запуске теста в том же Решарпере в режиме дебага он приостанавливает исполнение, как на обычном эксепшне:
Выброс исключения на дебаге
image

Да и студия при запуске тестов сама предлагает подебажить:
Сообщение от Visual Studio
image

Ну трюк-то в том, что для Java все эти пункты и так есть) А вот Решарпер в режиме отладки хорош, спасибо.

Кажется, текст статьи резко сократился
Sign up to leave a comment.