共用方式為


例外狀況:嘗試...with expression

本主題描述 try...with 表達式,這是用於 F# 中例外狀況處理的表達式。

語法

try
    expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...

備註

表達式 try...with 是用來處理 F# 中的例外狀況。 try...catch類似於 C# 中的語句。 在上述語法中, expression1 中的程式代碼可能會產生例外狀況。 表達式 try...with 會傳回值。 如果沒有擲回例外狀況,則整個表達式會傳回 expression1 的值。 如果擲回例外狀況,則會將每個模式與例外狀況進行比較,而針對第一個比對模式,則會針對該分支執行稱為例外狀況處理程序的對應表達式,而整體表達式會傳回該例外狀況處理程式中的表達式值。 如果沒有符合模式,例外狀況會傳播呼叫堆疊,直到找到相符的處理程序為止。 例外狀況處理程式中每個運算式所傳回的值類型必須符合區塊中 try 表達式傳回的類型。

經常發生錯誤的事實也表示每個例外狀況處理程式中的表達式都沒有任何有效的值可以傳回。 常見的模式是讓表達式的類型成為選項類型。 下列程式代碼範例說明此模式。

let divide1 x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divide1 100 0

例外狀況可以是 .NET 例外狀況,也可以是 F# 例外狀況。 您可以使用 關鍵詞來定義 F# 例外 exception 狀況。

您可以使用各種模式來篩選例外狀況類型和其他條件;下表摘要說明這些選項。

樣式 說明
:? exception-type 符合指定的 .NET 例外狀況類型。
:? exception-type 作為 標識符 符合指定的 .NET 例外狀況類型,但為例外狀況提供具名值。
exception-namearguments 比對 F# 例外狀況類型並系結自變數。
識別碼 比對任何例外狀況,並將名稱系結至例外狀況物件。 相當於 :?System.Exception 作為標識符
條件標識碼 如果條件為 true,則比對任何例外狀況。

範例

下列程式代碼範例說明如何使用各種例外狀況處理程式模式。

// 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 表達式。 如需詳細資訊,請參閱 異步表達式工作運算式計算運算式

另請參閱