Почему отладчик Visual Studio 2010 не выбирает символы отладки для обработки исключений в последовательности F #? - PullRequest
2 голосов
/ 20 февраля 2012

В Visual Studio 2010 следующая последовательность F # работает должным образом в режиме выпуска (игнорирует исключение UnauthorizedAccessException), но не работает правильно в режиме отладки (прерывается исключение UnauthorizedAccessException, даже если я установил «Исключения времени выполнения общего языка: Thrown = false» , User-Unhandled = true ").

open System
open System.IO

module private MyTestModule =
    let rec private getAllFiles dir = seq {
        if String.IsNullOrWhiteSpace dir |> not then
            let getAuthorizedItems getItems dir =
                try getItems dir
                with :? UnauthorizedAccessException -> [||]
            // Debugger stops here on UnauthorizedAccessException, but shouldn't...
            yield! getAuthorizedItems Directory.GetFiles dir 
            for subDir in getAuthorizedItems Directory.GetDirectories dir do 
                yield! getAllFiles subDir }
    // etc.

Однако, если я не вкладываю функцию getAuthorizedItems в последовательность, а помещаю ее на уровне модуля, отладчик работает правильно.

Примечание:

  1. Я посмотрел на сгенерированный код IL, и обработчик исключений находится там, где он должен быть в обоих случаях (никоим образом не изменен / не оптимизирован);
  2. Я знаю, что System.Core должен быть предварительно загружен, чтобы последовательности правильно отображались в отладчике, но это не связано с моей проблемой.

Существуют ли какие-либо специальные правила для обработки исключений в последовательностях во время отладки в F #?

Редактировать

После того, как я сообщил о проблеме, команда F # очень быстро начала отслеживать ее. Кажется, это небольшая ошибка, связанная с тем, что в режиме отладки часть сгенерированного кода помечается как «Внешний код», даже если это код пользователя. В настоящее время можно использовать обходные пути, предложенные в ответе пэда. Другой обходной путь - отключить «Включить только мой код» в параметрах отладки VS.

1 Ответ

2 голосов
/ 23 февраля 2012

Я могу воспроизвести ошибку на моей машине, используя F # 2.0 / .NET 4.0 без VS2010 SP1. Возможно, эта ошибка была исправлена ​​в VS2010 SP1, так как @svick не смог ее воспроизвести. Оказывается, эта ошибка сохраняется и после обновления VS2010 SP1.

Я думаю, что это ошибка обработки исключения во вложенных функциях внутри выражения последовательности, изменение вложенной функции для отлова любого исключения не влияет на поведение:

let getAuthorizedItems getItems dir =
    try getItems dir
    with ex -> [||]

Это небольшая ошибка; Вы можете обойти это разными способами:

  • Он работает в режиме выпуска, внутри fsi и даже работает в режиме отладки вне Visual Studio.
  • Объявление вложенной функции как inline заставляет ее работать в режиме отладки.
  • При включении опции Optimize code она снова заработает.
  • Также помогает не использование вложенных функций внутри seq.

Если это не исправлено, я предлагаю вам отправить отчет об ошибке на fsbugs на microsoft dot com .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...