Dela via


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

Se även