异常处理
编辑教程异常处理
异常是在程序执行期间出现的问题。 F#异常是对程序运行时出现的异常情况的响应,例如尝试除以零。
异常提供了一种将控制从程序的一个部分转移到另一个部分的方法。 F#异常处理提供了以下结构。
结构 | 描述 |
---|---|
raise expr | 引发给出例外。 |
failwith expr | 引发System.Exception的异常。 |
try expr with rules | 抓住表达式匹配模式规则。 |
try expr finally expr | 当计算成功时以及当引发异常时,执行finally表达式。 |
丨 :? ArgumentException | 规则匹配给定的.NET异常类型。 |
丨 :? ArgumentException as e | 规则匹配给定的.NET异常类型,绑定名称e将异常对象值。 |
丨 Failure(msg) → expr | 规则匹配给定的数据承载F#异常。 |
丨 exn → expr | 规则匹配任何异常,结合EXN异常对象值的名称。 |
丨 exn when expr → expr | 规则匹配给定条件下的例外,结合EXN异常对象值的名称。 |
让我们先从异常处理的基本语法。
语法
F#的异常处理块基本语法
exception exception-type of argument-type
注意,
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函数的语法是 -
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.
…
根据系统,还将显示有关文件和系统中导致错误的其他信息的其他信息。
Mos固件,小电视必刷固件
ES6 教程
Vue.js 教程
JSON 教程
jQuery 教程
HTML 教程
HTML 5 教程
CSS 教程
CSS3 教程
JavaScript 教程
DHTML 教程
JSON在线格式化工具
JS在线运行
JSON解析格式化
jsfiddle中国国内版本
JS代码在线运行
PHP代码在线运行
Java代码在线运行
C语言代码在线运行
C++代码在线运行
Python代码在线运行
Go语言代码在线运行
C#代码在线运行
JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。
大家可以一起参与进共编,让零散的知识点帮助更多的人。
X

选择支付方式:


立即支付

¥
9.99
无法付款,请点击这里
金额: 0 元
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟