f# try-with与reraise()结合返回有效类型.为什么



我正试图找出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()将返回值转换为有效类型。在本例中为整型。为什么会这样呢?这对所有类型都适用吗?

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

reraise的定义如下:

reraise : unit -> 'T

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

由于函数必须具有相同的结果类型,因此返回的更习惯的值将是Option类型。然后,如果捕获到异常,可以返回None,当操作成功时返回Some goodValue。这种习惯用法比使用异常处理控制流更可取,因为所有调用者必须显式地处理NoneSome情况,而不必用异常处理包装器包装所有调用代码。

下面是你的函数,如果转换为使用Option:

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

最新更新