例外狀況:try...with 運算式 (F#)
本主題描述 try...with 運算式,這是 F# 語言中用於例外處理的運算式。
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
備註
try...with 運算式用於處理 F# 中的例外狀況。 這類似於 C# 中的 try...catch陳述式。 在上述語法中,expression1 內的程式碼可能會產生例外狀況。 try...with 運算式會傳回值。 如果未擲回例外狀況,整個運算式會傳回 expression1 的值。 如果擲回例外狀況,每個 pattern 會輪流與此例外狀況比較,並針對第一個相符模式執行該分支的對應 expression (稱為「例外處理常式」(Exception Handler)),而且整個運算式會在該例外處理常式中傳回運算式的值。 如果沒有相符模式,例外狀況便會在呼叫堆疊中將此訊息往上傳,直至找到相符處理常式為止。 例外處理常式中每個運算式所傳回值的型別必須符合 try 區塊中運算式所傳回的型別。
發生錯誤經常也表示每個例外處理常式中沒有可從運算式傳回的有效值。 常見的模式是讓運算式的型別成為選項型別。 下列程式碼範例說明這個模式。
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
例外狀況可以是 .NET 例外狀況或 F# 例外狀況。 您可以透過 exception 關鍵字定義 F# 例外狀況。
您可以使用各種模式來篩選例外狀況型別和其他條件。下表將摘要說明選項。
模式 |
描述 |
---|---|
:? exception-type |
比對指定的 .NET 例外狀況型別。 |
:? exception-type as identifier |
比對指定的 .NET 例外狀況型別,但提供具名值給例外狀況。 |
exception-name(arguments) |
比對 F# 例外狀況型別及繫結引數。 |
identifier |
比對任何例外狀況,並將名稱繫結至例外狀況物件。 相當於:? System.Exception as 識別碼 |
identifier when condition |
如果符合條件,則比對所有例外狀況。 |
範例
在下列程式碼範例中,會示範各種例外處理常式模式的用法。
// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
try
Some( x / y )
with
| :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None
// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
try
x / y
with
| ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
| ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1
let result2 = divide3 100 0 true
// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int
let function1 x y =
try
if x = y then raise (Error1("x"))
else raise (Error2("x", 10))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
function1 10 10
function1 9 2
注意事項 |
---|
try...with 建構與 try...finally 運算式是兩個不同的運算式。 因此,如果程式碼需要 with 區塊和 finally 區塊,您必須巢狀化兩個運算式。 |
注意事項 |
---|
您可以在非同步工作流程和其他計算運算式中使用 try...with,在此情況下,會使用自訂 try...with 版本的運算式。 如需詳細資訊,請參閱非同步工作流程 (F#)和 計算運算式 (F#)。 |