我想弄清楚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。但那是为什么呢?并且对于所有类型的再加注都会这样做吗?
一般来说,我发现两者必须具有相同的返回类型有点问题。我的意思是通常你想要计算一些值,如果它无法捕获抛出字符串消息的异常。有人可以给我任何指导吗?
答案 0 :(得分:3)
reraise : unit -> 'T
的定义如下:
Option
这意味着它的结果类型适合从中返回它的包含函数的类型。由于抛出异常,它的返回值或多或少没有意义。在像Haskell这样的语言中,它可以被认为是bottom。
由于函数必须具有相同的结果类型,因此返回的更惯用的值将是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
:
{
text: 'Yes/No',
dataIndex: 'accompanied',
filter: {
type: 'list',
},
listeners: {
boxready: function (_this, width, height, eOpts) {
_this.filter.store = _this.lookupViewModel().getStore('dicYesNo');
}
}
}