Delen via


Uitzonderingen: functies genereren en opnieuw genereren

  • De raise functie wordt gebruikt om aan te geven dat er een fout of uitzonderlijke voorwaarde is opgetreden. Informatie over de fout wordt vastgelegd in een uitzonderingsobject.
  • De reraise functie wordt gebruikt om een afgehandelde uitzondering door te geven aan de aanroepketen.

Syntaxis

raise (expression)

Opmerkingen

De raise functie genereert een uitzonderingsobject en initieert een proces voor het afwikkelen van een stack. Het proces voor afwikkelen van de stack wordt beheerd door de Common Language Runtime (CLR), dus het gedrag van dit proces is hetzelfde als in een andere .NET-taal. Het proces voor afwikkelen van stacks is een zoekopdracht naar een uitzonderingshandler die overeenkomt met de gegenereerde uitzondering. De zoekopdracht begint in de huidige try...with expressie, als er een is. Elk patroon in het with blok wordt gecontroleerd, in volgorde. Wanneer een overeenkomende uitzonderingshandler wordt gevonden, wordt de uitzondering beschouwd als afgehandeld; anders wordt de stack niet uitgevoerd en with wordt de oproepketen geblokkeerd totdat er een overeenkomende handler wordt gevonden. Alle finally blokken die in de aanroepketen worden aangetroffen, worden ook op volgorde uitgevoerd wanneer de stack wordt afgewikkeld.

De raise functie is het equivalent van throw in C# of C++.

De volgende codevoorbeelden illustreren het gebruik van de raise functie om een uitzondering te genereren.

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

De raise functie kan ook worden gebruikt om .NET-uitzonderingen te genereren, zoals wordt weergegeven in het volgende voorbeeld.

let divide x y =
  if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
  else
     x / y

Een uitzondering opnieuw genereren

De reraise functie kan worden gebruikt in een with blok om een afgehandelde uitzondering door te geven aan de aanroepketen. reraise neemt geen uitzonderingsoperand. Dit is het handigst wanneer een methode een argument van een aanroeper doorgeeft aan een andere bibliotheekmethode en de bibliotheekmethode een uitzondering genereert die moet worden doorgegeven aan de aanroeper.

De reraise functie kan niet worden gebruikt voor het with blok trywith/van constructies in berekende lijsten, matrices, reeksen of berekeningsexpressies, waaronder task { .. } of .async { .. }

open System

let getFirstCharacter(value: string) =
    try
        value[0]
    with :? IndexOutOfRangeException as e ->
        reraise()

let s = getFirstCharacter("")
Console.WriteLine($"The first character is {s}")

// The example displays the following output:
//   System.IndexOutOfRangeException: Index was outside the bounds of the array.
//      at System.String.get_Chars(Int32 index)
//      at getFirstCharacter(String value)
//      at <StartupCode>.main@()

Zie ook