Dela via


Undantag: Försök... med uttryck

Det här avsnittet beskriver try...with uttrycket, uttrycket som används för undantagshantering i F#.

Syntax

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

Kommentarer

Uttrycket try...with används för att hantera undantag i F#. Den liknar -instruktionen try...catch i C#. I föregående syntax kan koden i expression1 generera ett undantag. Uttrycket try...with returnerar ett värde. Om inget undantag utlöses returnerar hela uttrycket värdet för expression1. Om ett undantag utlöses jämförs varje mönster i sin tur med undantaget, och för det första matchande mönstret körs motsvarande uttryck, som kallas undantagshanterare, för den grenen, och det övergripande uttrycket returnerar värdet för uttrycket i undantagshanteraren. Om inget mönster matchar sprids undantaget upp i anropsstacken tills en matchande hanterare hittas. De typer av värden som returneras från varje uttryck i undantagshanterarna måste matcha den typ som returneras från uttrycket i try blocket.

Ofta innebär det faktum att ett fel också uppstod att det inte finns något giltigt värde som kan returneras från uttrycken i varje undantagshanterare. Ett vanligt mönster är att uttryckets typ ska vara en alternativtyp. Följande kodexempel illustrerar det här mönstret.

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

let result1 = divide1 100 0

Undantag kan vara .NET-undantag eller F#-undantag. Du kan definiera F#-undantag med hjälp av nyckelordet exception .

Du kan använda en mängd olika mönster för att filtrera efter undantagstyp och andra villkor. alternativen sammanfattas i följande tabell.

Mönster beskrivning
:? undantagstyp Matchar den angivna .NET-undantagstypen.
:? undantagstyp som identifierare Matchar den angivna .NET-undantagstypen, men ger undantaget ett namngivet värde.
exception-name(arguments) Matchar en F#-undantagstyp och binder argumenten.
identifierare Matchar alla undantag och binder namnet till undantagsobjektet. Motsvarar :? System.Exception somidentifierare
identifierare när villkor Matchar alla undantag om villkoret är sant.

Exempel

Följande kodexempel illustrerar användningen av de olika undantagshanterarmönstren.

// 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

Kommentar

Konstruktionen try...with är ett separat uttryck från uttrycket try...finally . Om koden kräver både ett with block och ett finally block måste du därför kapsla de två uttrycken.

Kommentar

Du kan använda try...with i asynkrona uttryck, uppgiftsuttryck och andra beräkningsuttryck, i vilket fall en anpassad version av try...with uttrycket används. Mer information finns i Asynkrona uttryck, uppgiftsuttryck och beräkningsuttryck.

Se även