我知道如何捕获特定异常,如下例所示:
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
中使用通用异常,就像通配符一样。这样的结构是否存在,如果存在,它是什么?
答案 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