- F# 基础教程
- F# - 主页
- F# - 概述
- F# - 环境设置
- F# - 程序结构
- F# - 基本语法
- F# - 数据类型
- F# - 变量
- F# - 运算符
- F# - 决策
- F# - 循环
- F# - 函数
- F# - 字符串
- F# - 选项
- F# - 元组
- F# - 记录
- F# - 列表
- F# - 序列
- F# - 集
- F# - 地图
- F# - 受歧视的工会
- F# - 可变数据
- F# - 数组
- F# - 可变列表
- F# - 可变字典
- F# - 基本 I/O
- F# - 泛型
- F# - 代表
- F# - 枚举
- F# - 模式匹配
- F# - 异常处理
- F# - 类
- F# - 结构
- F# - 运算符重载
- F# - 继承
- F# - 接口
- F# - 事件
- F# - 模块
- F# - 命名空间
- F# 有用资源
- F# - 快速指南
- F# - 有用的资源
- F# - 讨论
F# - 异常处理
异常是程序执行过程中出现的问题。F# 异常是对程序运行时出现的异常情况的响应,例如尝试除以零。
异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。F# 异常处理提供以下构造 -
构造 | 描述 |
---|---|
提高表达式 | 引发给定的异常。 |
因表达式失败 | 引发System.Exception异常。 |
尝试使用 expr 规则 | 捕获与模式规则匹配的表达式。 |
尝试 expr 最后 expr | 当计算成功和引发异常时都执行finally表达式。 |
| :? 参数异常 | 与给定 .NET 异常类型匹配的规则。 |
| :? ArgumentException 作为 e | 与给定 .NET 异常类型匹配的规则,将名称e绑定到异常对象值。 |
| 失败(消息)→ expr | 与给定数据携带 F# 异常匹配的规则。 |
| exn → expr | 匹配任何异常的规则,将名称exn绑定到异常对象值。 |
| exn 当 expr → expr | 在给定条件下匹配异常的规则,将名称exn绑定到异常对象值。 |
让我们从异常处理的基本语法开始。
句法
F# 异常处理块的基本语法是 -
exception exception-type of argument-type
在哪里,
异常类型是新的 F# 异常类型的名称。
argument-type表示引发该类型异常时可以提供的参数类型。
可以通过使用元组类型作为参数类型来指定多个参数。
try ...with表达式用于 F# 语言中的异常处理。
try … with 表达式的语法是 -
try expression1 with | pattern1 -> expression2 | pattern2 -> expression3 ...
即使代码块抛出异常, try ...finally表达式也允许您执行清理代码。
try …finally 表达式的语法是 -
try expression1 finally expression2
raise函数用于指示发生了错误或异常情况。它还捕获有关异常对象中的错误的信息。
raise 函数的语法是 -
raise (expression)
failwith函数生成 F# 异常。
failwith 函数的语法是 -
failwith error-message-string
invalidArg函数生成参数异常。
invalidArg parameter-name error-message-string
异常处理示例
实施例1
以下程序通过简单的 try...with 块显示了基本的异常处理 -
let divisionprog x y = try Some (x / y) with | :? System.DivideByZeroException -> printfn "Division by zero!"; None let result1 = divisionprog 100 0
当您编译并执行该程序时,它会产生以下输出 -
Division by zero!
实施例2
F# 提供了用于声明异常的异常类型。您可以直接在过滤器中的try...with表达式中使用异常类型。
以下示例演示了这一点 -
exception Error1 of string // Using a tuple type as the argument type. exception Error2 of string * int let myfunction x y = try if x = y then raise (Error1("Equal Number Error")) else raise (Error2("Error Not detected", 100)) with | Error1(str) -> printfn "Error1 %s" str | Error2(str, i) -> printfn "Error2 %s %d" str i myfunction 20 10 myfunction 5 5
当您编译并执行该程序时,它会产生以下输出 -
Error2 Error Not detected 100 Error1 Equal Number Error
实施例3
以下示例演示了嵌套异常处理 -
exception InnerError of string exception OuterError of string let func1 x y = try try if x = y then raise (InnerError("inner error")) else raise (OuterError("outer error")) with | InnerError(str) -> printfn "Error:%s" str finally printfn "From the finally block." let func2 x y = try func1 x y with | OuterError(str) -> printfn "Error: %s" str func2 100 150 func2 100 100 func2 100 120
当您编译并执行该程序时,它会产生以下输出 -
From the finally block. Error: outer error Error:inner error From the finally block. From the finally block. Error: outer error
实施例4
以下函数演示了failwith函数 -
let divisionFunc x y = if (y = 0) then failwith "Divisor cannot be zero." else x / y let trydivisionFunc x y = try divisionFunc x y with | Failure(msg) -> printfn "%s" msg; 0 let result1 = trydivisionFunc 100 0 let result2 = trydivisionFunc 100 4 printfn "%A" result1 printfn "%A" result2
当您编译并执行该程序时,它会产生以下输出 -
Divisor cannot be zero. 0 25
实施例5
invalidArg函数生成参数异常。以下程序演示了这一点 -
let days = [| "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" |] let findDay day = if (day > 7 || day < 1) then invalidArg "day" (sprintf "You have entered %d." day) days.[day - 1] printfn "%s" (findDay 1) printfn "%s" (findDay 5) printfn "%s" (findDay 9)
当您编译并执行该程序时,它会产生以下输出 -
Sunday Thursday Unhandled Exception: System.ArgumentException: You have entered 9. …
根据系统的不同,还会显示有关导致系统错误的文件和变量的一些其他信息。