我正试图找出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
。这种习惯用法比使用异常处理控制流更可取,因为所有调用者必须显式地处理None
和Some
情况,而不必用异常处理包装器包装所有调用代码。
下面是你的函数,如果转换为使用Option
:
let safeIndexTry (anArray : array<'a>) (i : int) : 'a option =
try
Some <| Array. item i anArray
with
| :? System.IndexOutOfRangeException as ex -> None