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 try
with
/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@()