F#基础教程 异常与异常处理

      在F#里异常的定义类似于联合类型构造函数的定义,异常处理的语法类似于模式匹配。定义异常,你可以使用exception 关键字,然后是异常名称,和可选的关键字of 和异常包含值的所有类型,多种类型用星号分隔。下一个例子演示了一个异常的定义,WrongSecond,其中包含一个整数值。

exception WrongSecond of int

      你可以使用关键字raise抛出一个异常,如下testSecond函数的else子句。F#中还有一个引发异常关键字,failwith 函数,如以下的if子句。通常情况下,如果你只想抛出一个说明什么地方出了错的文字(异常),你可以使用failwith 抛出一个通用异常,传递其包含的文本给函数。

let primes =
    [ 2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47; 53; 59 ]


let testSecond() =
    try
        let currentSecond = System.DateTime.Now.Second in
        if List.exists (fun x -> x = currentSecond) primes then
            failwith "A prime second"
        else
            raise (WrongSecond currentSecond)
    with
            WrongSecond x ->
                printf "The current was %i, which is not prime" x
testSecond()

      如示例testSecond,try和with关键字处理异常。在关键字try和with之间的表达式在异常时受到异常处理,在with关键字后一个或多个模式匹配规则匹配异常。当试图匹配一个F#异常,语法如匹配一个联合类型的构造函数。异常的名称构成上半部分,然后是标识符或通配符匹配异常包含的值。下半部分是如何处理异常状态的一个表达式。这与规则匹配的区别是,如果模式匹配是不完整的,不会发出警告或错误。这是因为,任何未处理的异常都会向上传播,直到它们到达顶层才停止执行。例如异常处理wrongSecond,离开failwith 同将时异常传播。

      F#还支持一个finally关键字,与关键字try一起使用。你可以结合使用finally关键字与with关键字用于异常处理的一些规则或无规则。始终将finally表达式放于代码块后,如果它存在,finally表达式将执行,无论是否抛出异常。下面的例子演示了使用finally块,以确保文件在写入后关闭和disposed。

#light
let writeToFile() =
    let file = System.IO.File.CreateText("test.txt") in
    try
        file.WriteLine("Hello F# users")
    finally
        file.Dispose()
writeToFile()

转载于:https://www.cnblogs.com/IBBC/archive/2011/12/07/2279061.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值