F#如何捕获所有异常

时间:2017-05-18 21:02:01

标签: .net f# pattern-matching wildcard try-with

我知道如何捕获特定异常,如下例所示:

let test_zip_archive candidate_zip_archive =
  let rc =
      try
        ZipFile.Open(candidate_zip_archive.ToString(), ZipArchiveMode.Read) |> ignore
      zip_file_ok
      with
      | :? System.IO.InvalidDataException -> not_a_zip_file
      | :? System.IO.FileNotFoundException -> file_not_found         
      | :? System.NotSupportedException -> unsupported_exception
  rc

我正在阅读一堆文章,看看我是否可以在with中使用通用异常,就像通配符一样。这样的结构是否存在,如果存在,它是什么?

2 个答案:

答案 0 :(得分:9)

是的,你可以这样做:

let foo = 
  try
    //stuff (e.g.)
    //failwith "wat?"
    //raise (System.InvalidCastException())
    0 //return 0 when OK
  with ex ->
    printfn "%A" ex //ex is any exception 
    -1 //return -1 on error

这与C#' s catch (Exception ex) { }

相同

要丢弃您可以执行的错误with _ -> -1(与C#' s catch { }相同)

答案 1 :(得分:4)

我喜欢您应用类型模式测试的方式(请参阅link)。您正在寻找的模式称为通配符模式。可能你已经知道了,但是没有意识到你也可以在这里使用它。 需要记住的重要一点是,try-catch块的 with 部分遵循匹配语义。所以,所有其他漂亮的模式都适用于此:

使用您的代码(以及一些装饰以便您可以在FSI中运行它),请按照以下步骤操作:

#r "System.IO.Compression.FileSystem.dll"
#r "System.IO.Compression.dll"

open System  
open System.IO
open System.IO.Compression

type Status = 
  | Zip_file_ok
  | Not_a_zip_file
  | File_not_found
  | Unsupported_exception
  | I_am_a_catch_all

let test_zip_archive candidate_zip_archive =
  let rc() =
    try
      ZipFile.Open(candidate_zip_archive.ToString(), ZipArchiveMode.Read) |> ignore
      Zip_file_ok
    with
    | :? System.IO.InvalidDataException -> Not_a_zip_file
    | :? System.IO.FileNotFoundException -> File_not_found         
    | :? System.NotSupportedException -> Unsupported_exception
    | _ -> I_am_a_catch_all // otherwise known as "wildcard"
  rc