【问题标题】:Catch exception in sharp尖锐地捕捉异常
【发布时间】:2021-01-08 10:11:44
【问题描述】:

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

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

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

【问题讨论】:

  • 请分享其他人重现您的问题所需的最少代码量(也称为minimum, reproducible example
  • 我可以从更新的代码中看到startPos, endPos 上的模式匹配不完整,但它仍然无法重现 IndexOutOfRangeException

标签: exception f# arguments try-catch


【解决方案1】:

您发布的代码无法编译(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!"

将捕获任何异常并将某些内容打印到控制台。异常处理路径需要返回与try-path相同的类型,所以如果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

【讨论】:

  • 谢谢!我不知道如何处理它,但它有效:)
  • @AlphaList 捕获异常是好的,但防止它们更好
  • @SergeyBerezovskiy 你也是对的 :) 我现在已经解决了我的问题,所以不需要捕获异常 :D
猜你喜欢
  • 2012-01-10
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多