codecamp

F#异常处理

异常是在程序执行期间出现的问题。 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.
…

根据系统,还将显示有关文件和系统中导致错误的其他信息的其他信息。

F#模式匹配
F#类
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }