W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
結(jié)構(gòu) | 描述 |
---|---|
raise expr | 引發(fā)給出例外。 |
failwith expr | 引發(fā)System.Exception的異常。 |
try expr with rules | 抓住表達(dá)式匹配模式規(guī)則。 |
try expr finally expr | 當(dāng)計(jì)算成功時(shí)以及當(dāng)引發(fā)異常時(shí),執(zhí)行finally表達(dá)式。 |
| :? ArgumentException | 規(guī)則匹配給定的.NET異常類型。 |
| :? ArgumentException as e | 規(guī)則匹配給定的.NET異常類型,綁定名稱e將異常對(duì)象值。 |
| Failure(msg) → expr | 規(guī)則匹配給定的數(shù)據(jù)承載F#異常。 |
| exn → expr | 規(guī)則匹配任何異常,結(jié)合EXN異常對(duì)象值的名稱。 |
| exn when expr → expr | 規(guī)則匹配給定條件下的例外,結(jié)合EXN異常對(duì)象值的名稱。 |
讓我們先從異常處理的基本語(yǔ)法。
F#的異常處理塊基本語(yǔ)法
exception exception-type of argument-type
注意,
exception-type是一個(gè)新的F#的異常類型的名稱。
argument-type代表可以當(dāng)你提出這個(gè)類型的異常提供一個(gè)參數(shù)的類型。
多個(gè)參數(shù)可以通過(guò)使用自變量類型的元組類型來(lái)指定。
try ... with表達(dá)式 用于在F#語(yǔ)言中進(jìn)行異常處理。
try ... with的語(yǔ)法示例
try expression1 with | pattern1 -> expression2 | pattern2 -> expression3 ...
try ... finally表達(dá)式允許你執(zhí)行清理代碼,即使一個(gè)代碼塊拋出異常。
try ... finally的語(yǔ)法
try expression1 finally expression2raise函數(shù)用于指示發(fā)生錯(cuò)誤或異常情況。 它還捕獲異常對(duì)象中有關(guān)錯(cuò)誤的信息。
raise (expression)
該failwith函數(shù)產(chǎn)生一個(gè)F#異常。
failwith函數(shù)的語(yǔ)法是
failwith error-message-string
invalidArg函數(shù)生成參數(shù)異常。
invalidArg parameter-name error-message-string
下面的程序顯示了使用簡(jiǎn)單的try ... with塊的基本異常處理
let divisionprog x y = try Some (x / y) with | :? System.DivideByZeroException -> printfn "Division by zero!"; None let result1 = divisionprog 100 0
當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
Division by zero!
F#提供了一個(gè)用于聲明異常的異常類型。 您可以在try ... with表達(dá)式中直接在過(guò)濾器中使用異常類型。
下面的例子演示了一個(gè)例子
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
當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
Error2 Error Not detected 100 Error1 Equal Number Error
下面的示例演示嵌套的異常處理
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
當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
From the finally block. Error: outer error Error:inner error From the finally block. From the finally block. Error: outer error
下面的函數(shù)演示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
當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
Divisor cannot be zero. 0 25
invalidArg函數(shù)生成參數(shù)異常。 以下程序演示了這一點(diǎn)
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)
當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出
Sunday Thursday Unhandled Exception: System.ArgumentException: You have entered 9. …
根據(jù)系統(tǒng),還將顯示有關(guān)文件和系統(tǒng)中導(dǎo)致錯(cuò)誤的其他信息的其他信息。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: