Undantag: skapa och ändra storlek på funktioner
- Funktionen
raise
används för att indikera att ett fel eller ett exceptionellt villkor har inträffat. Information om felet samlas in i ett undantagsobjekt. - Funktionen
reraise
används för att sprida ett hanterat undantag i anropskedjan.
Syntax
raise (expression)
Kommentarer
Funktionen raise
genererar ett undantagsobjekt och initierar en rensningsprocess för stacken. Processen för att varva ned stacken hanteras av CLR (Common Language Runtime), så beteendet för den här processen är detsamma som på andra .NET-språk. Processen för att varva ned stacken är en sökning efter en undantagshanterare som matchar det genererade undantaget. Sökningen startar i det aktuella try...with
uttrycket, om det finns ett. Varje mönster i with
blocket är markerat i ordning. När en matchande undantagshanterare hittas betraktas undantaget som hanterat. Annars tas stacken bort och with
blockerar anropskedjan tills en matchande hanterare hittas. Alla finally
block som påträffas i anropskedjan körs också i följd när stacken varvar ned.
Funktionen raise
motsvarar throw
i C# eller C++.
Följande kodexempel illustrerar användningen av raise
funktionen för att generera ett undantag.
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
Funktionen raise
kan också användas för att skapa .NET-undantag, som du ser i följande exempel.
let divide x y =
if (y = 0) then raise (System.ArgumentException("Divisor cannot be zero!"))
else
x / y
Ändra storlek på ett undantag
Funktionen reraise
kan användas i ett with
block för att sprida ett hanterat undantag i anropskedjan.
reraise
tar inte en undantagsopernd. Det är mest användbart när en metod skickar ett argument från en anropare till någon annan biblioteksmetod, och biblioteksmetoden genererar ett undantag som måste skickas till anroparen.
Funktionen reraise
kanske inte används i byggblocket with
try
with
/i beräknade listor, matriser, sekvenser eller beräkningsuttryck inklusive task { .. }
eller .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@()