Delen via


Uitzonderingen: Het proberen... met expressie

In dit onderwerp wordt de try...with expressie beschreven, de expressie die wordt gebruikt voor het verwerken van uitzonderingen in F#.

Syntaxis

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

Opmerkingen

De try...with expressie wordt gebruikt voor het afhandelen van uitzonderingen in F#. Deze is vergelijkbaar met de try...catch instructie in C#. In de voorgaande syntaxis kan de code in expression1 een uitzondering genereren. De try...with expressie retourneert een waarde. Als er geen uitzondering wordt gegenereerd, retourneert de hele expressie de waarde van expressie1. Als er een uitzondering wordt gegenereerd, wordt elk patroon op zijn beurt vergeleken met de uitzondering, en voor het eerste overeenkomende patroon wordt de bijbehorende expressie, ook wel de uitzonderingshandler genoemd, voor die vertakking uitgevoerd en retourneert de algehele expressie de waarde van de expressie in die uitzonderingshandler. Als er geen patroon overeenkomt, wordt de aanroepstack doorgegeven door de uitzondering totdat er een overeenkomende handler wordt gevonden. De typen waarden die door elke expressie in de uitzonderingshandlers worden geretourneerd, moeten overeenkomen met het type dat wordt geretourneerd door de expressie in het try blok.

Vaak betekent het feit dat er een fout is opgetreden ook dat er geen geldige waarde is die kan worden geretourneerd vanuit de expressies in elke uitzonderingshandler. Een frequent patroon is dat het type expressie een optietype is. In het volgende codevoorbeeld ziet u dit patroon.

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

let result1 = divide1 100 0

Uitzonderingen kunnen .NET-uitzonderingen zijn of F#-uitzonderingen. U kunt F#-uitzonderingen definiƫren met behulp van het exception trefwoord.

U kunt verschillende patronen gebruiken om te filteren op het uitzonderingstype en andere voorwaarden; de opties worden samengevat in de volgende tabel.

Patroon Beschrijving
:? uitzonderingstype Komt overeen met het opgegeven .NET-uitzonderingstype.
:? uitzonderingstype als id Komt overeen met het opgegeven .NET-uitzonderingstype, maar geeft de uitzondering een benoemde waarde.
uitzonderingsnaam(argumenten) Komt overeen met een F#-uitzonderingstype en verbindt de argumenten.
id Komt overeen met een uitzondering en verbindt de naam met het uitzonderingsobject. Gelijk aan :? System.Exception asidentifier
id wanneer voorwaarde Komt overeen met een uitzondering als de voorwaarde waar is.

Voorbeelden

De volgende codevoorbeelden illustreren het gebruik van de verschillende uitzonderingshandlerpatronen.

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

Notitie

De try...with constructie is een afzonderlijke expressie van de try...finally expressie. Als voor uw code zowel een blok als with een finally blok is vereist, moet u de twee expressies nesten.

Notitie

U kunt in asynchrone expressies, taakexpressies en andere rekenexpressies gebruiken try...with . In dat geval wordt een aangepaste versie van de try...with expressie gebruikt. Zie Async-expressies, taakexpressies en rekenexpressies voor meer informatie.

Zie ook