捕捉异常

时间:2021-01-08 10:11:44

标签: exception f# arguments try-catch

我制作了一个程序,用户可以在终端中输入突击队,但是当用户输入“退出”时出现异常。我怎么抓住它?下面的代码只是一个片段,因为我的代码很长。

  let mutable input = ""
  while myTurn = true do 
  input <- System.Console.ReadLine()
  match input with
  |_ when input = "quit" -> (myTurn <- false)
  |_ -> printfn "Incorrect input"

现在,当我输入“quit”时,我的终端给出了 System.IndexOutOfRangeException 但是,如果我将“退出”更改为任何其他词,它就会起作用。有没有办法让它与退出这个词一起工作?

1 个答案:

答案 0 :(得分:2)

您发布的代码无法编译(未定义 myTurn、startPos、endPos),所以不,它实际上并不是 Sergey Berezovskiy 要求的 MRE。即使你的代码被修改为

let mutable myTurn = true
let mutable input = ""
while myTurn = true do 
    input <- System.Console.ReadLine()
    match input with
    |_ when input = "quit" -> (myTurn <- false)
    |_ -> printfn "Incorrect input"

它在输入“quit”时不会抛出异常。所以我无法帮你追踪异常。

然而,您实际上问的是如何捕获异常,为此您需要一个 try ... with ...。例如

try potentiallyThrowingFunction "abc" 123
with e -> printfn "Oh snap!"

将捕获任何异常并将某些内容打印到控制台。异常处理路径需要返回与尝试路径相同的类型,因此如果 potentiallyThrowingFunction 返回一个 int,异常处理代码也需要返回一个 int(或抛出一个新的异常或重新抛出原来的)

实际上,如果您想以不同的方式处理不同的异常,您可以使用 try ... with ... 对异常进行模式匹配;例如

try potentiallyThrowingFunction "abc" 123
with 
    | :? System.ArgumentException as e -> 
        printfn "Oh dang! ArgumentException: %s" e.Message
    | :? System.IndexOutOfRangeException as e ->
        printfn "Woops, IndexOutOfRangeException: %s" e.Message