В 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 в последовательность, а помещаю ее на уровне модуля, отладчик работает правильно.
Примечание:
- Я посмотрел на сгенерированный код IL, и обработчик исключений находится там, где он должен быть в обоих случаях (никоим образом не изменен / не оптимизирован);
- Я знаю, что System.Core должен быть предварительно загружен, чтобы последовательности правильно отображались в отладчике, но это не связано с моей проблемой.
Существуют ли какие-либо специальные правила для обработки исключений в последовательностях во время отладки в F #?
Редактировать
После того, как я сообщил о проблеме, команда F # очень быстро начала отслеживать ее. Кажется, это небольшая ошибка, связанная с тем, что в режиме отладки часть сгенерированного кода помечается как «Внешний код», даже если это код пользователя. В настоящее время можно использовать обходные пути, предложенные в ответе пэда. Другой обходной путь - отключить «Включить только мой код» в параметрах отладки VS.