[DotNetBook] Время занимательных историй: исключительно исключительные ситуации

  • Tutorial

Существует ряд исключительных ситуаций, которые скажем так… Несколько более исключительны чем другие. Причем если попытаться их классифицировать, то как и было сказано в самом начале главы, есть исключения родом из самого .NET приложения, а есть исключения родом из unsafe мира. Их в свою очередь можно разделить на две подкатегории: иcключительные ситуации ядра CLR (которое по своей сути — unsafe) и любой unsafe код внешних библиотек.


Давайте поговорим про эти особые исключительные ситуации.


ThreadAbortException


Вообще, это может показаться не очевидным, но существует четыре типа Thread Abort.


Примечание


Глава, опубликованная на Хабре не обновляется и возможно, уже несколько устарела. А потому, прошу обратиться за более свежим текстом к оригиналу:


Поделиться публикацией
Комментарии 10
    +1

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

      +1
      Самому стало любопытно — проверил. Решарпер успешно поймал исключение и выдал ошибку «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
        0

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

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

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

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

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

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


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

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

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

      0
      Кажется, текст статьи резко сократился

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое