Регистрирует ли .net новый обработчик исключений каждый раз, когда открывается блок try? - PullRequest
6 голосов
/ 19 октября 2011

Просто читаю об исключениях первого и второго шанса.И что при отладке отладчик получает исключение первого шанса до того, как это сделает программа.Помните, как работает прикрепление обработчика исключений.Является ли это случаем, что каждый раз, когда открывается блок try, присоединяется другой обработчик исключений?

Ответы [ 2 ]

3 голосов
/ 19 октября 2011

Вот я нашел замечательную статью Junfeng Zhang's : "От необработанного исключения до присоединения к отладчику"

Это называется настройками отладки после смерти. Вы можете самостоятельно настроить отладчик после смерти в системном реестре Windows, когда Visual Studio установит раздел реестра \\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\AeDebug, содержащий:

"C:\WINNT\system32\vsjitdebugger.exe" -p %ld -e %ld

Итак, отладчик Visual Studio JIT определен как отладчик по умолчанию.

Только ключевые моменты: (подробности см. В статье)

Windows может обрабатывать ошибки пользовательского режима различными способами. следующая последовательность показывает приоритет, используемый для обработки ошибок:

  1. Если отладчик пользовательского режима в настоящее время подключен к отказавшему процессу, все ошибки приведут к тому, что целевой объект попадет в этот отладчик.

  2. Если отладчик в пользовательском режиме не подключен и исполняемый код имеет свои собственные процедуры обработки исключений (например, try - кроме), это Процедура обработки исключений попытается устранить ошибку.

  3. Если отладчик в пользовательском режиме не подключен, а в Windows имеется открытое соединение для отладки ядра, и ошибка является прерыванием точки останова, Windows попытается связаться с отладчиком ядра.
0 голосов
/ 19 октября 2011

(исправлено) С точки зрения производительности, использование try / catch имеет небольшой успех за 2 миллиарда итераций при запуске в режиме выпуска.

        var watch = new Stopwatch();
        watch.Start();

        var cnt = 0;
        for (int i = 0; i < int.MaxValue; i++)
        {
            try
            {
                cnt++;
            }
            catch (Exception ex)
            {
            }
        }

        watch.Stop();
        Console.WriteLine(watch.Elapsed);

        // takes 00:00:06.25

и

        var watch = new Stopwatch();
        watch.Start();

        var cnt = 0;
        for (int i = 0; i < int.MaxValue; i++)
        {
            cnt++;
        }

        watch.Stop();
        Console.WriteLine(watch.Elapsed);

        // takes 00:00:00.90
...