Freigeben über


Ausnahmen: Der Versuch... abschließender Ausdruck

Mit dem try...finally Ausdruck können Sie Bereinigungscode auch dann ausführen, wenn ein Codeblock eine Ausnahme auslöst.

Syntax

try
    expression1
finally
    expression2

Bemerkungen

Der try...finally Ausdruck kann verwendet werden, um den Code in Expression2 in der vorherigen Syntax auszuführen, unabhängig davon, ob während der Ausführung von Expression1 eine Ausnahme generiert wird.

Der Ausdruckstyp2 trägt nicht zum Wert des gesamten Ausdrucks bei; Der Typ, der zurückgegeben wird, wenn keine Ausnahme auftritt, ist der letzte Wert in Expression1. Wenn eine Ausnahme auftritt, wird kein Wert zurückgegeben, und der Ablauf der Steuerung wird an den nächsten übereinstimmenden Ausnahmehandler bis zum Aufrufstapel übertragen. Wenn kein Ausnahmehandler gefunden wird, wird das Programm beendet. Bevor der Code in einem übereinstimmenden Handler ausgeführt wird oder das Programm beendet wird, wird der Code in der finally Verzweigung ausgeführt.

Der folgende Code veranschaulicht die Verwendung des try...finally Ausdrucks.

let divide x y =
   let stream : System.IO.FileStream = System.IO.File.Create("test.txt")
   let writer : System.IO.StreamWriter = new System.IO.StreamWriter(stream)
   try
      writer.WriteLine("test1")
      Some( x / y )
   finally
      writer.Flush()
      printfn "Closing stream"
      stream.Close()

let result =
  try
     divide 100 0
  with
     | :? System.DivideByZeroException -> printfn "Exception handled."; None

Die Ausgabe in der Konsole lautet wie folgt.

Closing stream
Exception handled.

Wie Sie aus der Ausgabe sehen können, wurde der Datenstrom vor der Verarbeitung der äußeren Ausnahme geschlossen, und die Datei test.txt enthält den Text test1, der angibt, dass die Puffer geleert und auf den Datenträger geschrieben wurden, auch wenn das Ausnahmesteuerelement auf den äußeren Ausnahmehandler übertragen wurde.

Beachten Sie, dass das try...with Konstrukt ein separates Konstrukt vom try...finally Konstrukt ist. Wenn Ihr Code also sowohl einen with Block als auch einen finally Block erfordert, müssen Sie die beiden Konstrukte wie im folgenden Codebeispiel schachteln.

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

Versuchen Sie im Kontext von Berechnungsausdrücken, einschließlich Sequenzausdrücke und asynchronen Ausdrücken ... Schließlich können Ausdrücke eine benutzerdefinierte Implementierung haben. Weitere Informationen finden Sie unter Berechnungsausdrücke.

Siehe auch