F#try-with与reraise()结合使用返回有效类型。为什么?

时间:2016-11-01 12:01:39

标签: exception f# try-catch

我想弄清楚F#中的试用。正如我所理解的那样,try的返回类型必须与with的返回类型相同。

但是,当我做这样的事情时,为什么呢?

 let safeIndexTry (anArray : array<'a>) (i : int) = 
  try 
    Array. item i anArray
  with
    | :? System.IndexOutOfRangeException as ex -> printfn "%s" ex.Message 
                                                  reraise()

然后我可以想到它。然后reraise()将返回值转换为有效类型。在这种情况下是一个int。但那是为什么呢?并且对于所有类型的再加注都会这样做吗?

一般来说,我发现两者必须具有相同的返回类型有点问题。我的意思是通常你想要计算一些值,如果它无法捕获抛出字符串消息的异常。有人可以给我任何指导吗?

1 个答案:

答案 0 :(得分:3)

reraise : unit -> 'T 的定义如下:

Option

这意味着它的结果类型适合从中返回它的包含函数的类型。由于抛出异常,它的返回值或多或少没有意义。在像Haskell这样的语言中,它可以被认为是bottom

由于函数必须具有相同的结果类型,因此返回的更惯用的值将是None类型。如果捕获到异常,您可以返回Some goodValue,并在操作成功时返回None。这个习惯比使用异常来处理控制流更受欢迎,因为所有调用者必须显式处理SomeOption个案,而不必用异常处理包装器包装所有调用代码。

如果转换为使用let safeIndexTry (anArray : array<'a>) (i : int) : 'a option = try Some <| Array. item i anArray with | :? System.IndexOutOfRangeException as ex -> None

,则以下是您的函数的外观
        {
            text: 'Yes/No',
            dataIndex: 'accompanied',
            filter: {
                type: 'list',
            },
            listeners: {
                boxready: function (_this, width, height, eOpts) {
                    _this.filter.store = _this.lookupViewModel().getStore('dicYesNo');
                }
            }
        }