Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.