【问题标题】:F# Array.FindIndex exception handlingF# Array.FindIndex 异常处理
【发布时间】:2021-01-24 18:33:13
【问题描述】:

我有以下函数可以在数组中找到索引

let numbers_array = [| "1"; "2"; "3"|]
let findIndex arr elem = arr |> Array.findIndex ((=) elem)

let s = "123"
findIndex numbers_array (string s.[0]))

但是如果我尝试运行

findIndex numbers_array (string s.[10]))

超出范围并抛出以下错误

System.Collections.Generic.KeyNotFoundException:在集合中找不到满足谓词的索引。

我怎样才能使我的函数不抛出异常,而是执行类似 printf 语句的操作?

【问题讨论】:

  • 我相信有一个tryFindIndex。
  • tryFindIndex 返回一个我不能使用的选项类型
  • 为什么不能使用选项?您可以捕获KeyNotFoundException,但您仍然必须决定在错误情况下返回什么。
  • 该问题包含应更正的错误。源代码不可编译。它也没有以斜体显示错误。提到的越界错误发生在函数的参数中,因此不相关。
  • tryFindIndex 绝对是正确的选择。如果您不想更改函数的签名,可以printf 以防tryFindIndex 返回None,然后返回-1。 (有关基于此的建议答案,请参见下文。)

标签: arrays sorting exception collections f#


【解决方案1】:

我认为这接近你想要的:

let findIndex arr elem =
    match arr |> Array.tryFindIndex ((=) elem) with
        | Some index -> index
        | None ->
            printfn "Not found"
            -1

它维护您现在拥有的相同函数签名,并在未找到元素时生成错误消息作为副作用。 (请注意,在这种情况下,函数仍然必须返回 int,所以我选择了 -1。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多