При отладке кода C# Visual Studio показывает исходное местоположение необработанного исключения.Неправильное расположение необработанного исключения при отладке кода F # в Visual Studio
Например, при отладке следующего кода Visual Studio показывает необработанное DivideByZeroException было брошено на линии 9.
Я хочу сделать то же самое в F #. Ниже приведен мой перевод выше кода на F #.
open System
let f() = raise (new DivideByZeroException()) // line 3
[<EntryPoint>]
let main argv =
try
f()
with :? ArgumentException ->() // line 9
0
Когда я отладить этот код на Visual Studio, он разбивает на необработанное исключение и точек линии 9. Я ожидаю, что он указывает линию 3.
Я попытался Microsoft.FSharp.Core.Operators.reraise, но это не изменил результат.
EDIT захват # отладки экрана
C
F захват # отладки экрана
Сформирован IL для C#
Сформирован IL для F #
Держу пари, что компилятор ввел функцию на сайт вызова. Вы строите с включенными оптимизациями? Можете ли вы просмотреть скомпилированный код с помощью ILSpy? –
Оптимизация не включена. Я проверил его с помощью ILSpy. Похоже, что это не указано, он называет команду «ретрой». Но не уверен, потому что его трудно читать. –
Интересно, что IL для кода C# не использует команду rethrow, потому что она только улавливает ArgumentException. Сгенерированный IL для F # захватывает System.Object и проверяет его сгенерированным кодом, и когда он не соответствует ему, вызывает команду rethrow. Таким образом, в IL-коде была разница. –