F# - 异常处理( Exception Handling)
优质
小牛编辑
128浏览
2023-12-01
例外是在执行程序期间出现的问题。 F#异常是对程序运行时出现的异常情况的响应,例如尝试除以零。
例外提供了一种将控制从程序的一个部分转移到另一个部分的方法。 F#异常处理提供以下结构 -
构造 | 描述 |
---|---|
raise expr | Raises the given exception. |
failwith expr | 引发System.Exception异常。 |
try expr with rules | 捕获与模式规则匹配的表达式。 |
尝试expr finally expr | 在计算成功和引发异常时执行finally表达式。 |
| :? ArgumentException的 | 与给定.NET异常类型匹配的规则。 |
| :? ArgumentException为e | 与给定.NET异常类型匹配的规则,将名称e绑定到异常对象值。 |
| 失败(msg)→expr | 与给定的携带数据的F#异常匹配的规则。 |
| exn→expr | 匹配任何异常的规则,将名称exn绑定到异常对象值。 |
| 当expr→expr时exn | 在给定条件下匹配异常的规则,将名称exn绑定到异常对象值。 |
让我们从异常处理的基本语法开始。
语法 (Syntax)
F#异常处理块的基本语法是 -
exception exception-type of argument-type
Where,
exception-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 (expression)
failwith函数会生成F#异常。
failwith函数的语法是 -
failwith error-message-string
invalidArg函数生成参数异常。
invalidArg parameter-name error-message-string
异常处理示例
例子1 (Example 1)
以下程序通过简单的尝试显示基本的异常处理...使用块 -
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 (Example 2)
F#提供了一种用于声明异常的exception类型。 您可以在try...with expression中直接在过滤器中使用异常类型。
以下示例演示了这一点 -
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 (Example 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 (Example 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 (Example 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.
…
根据系统的不同,还将显示有关系统中导致错误的文件和变量的其他一些信息。