Undantag: Försök... med uttryck
Det här avsnittet beskriver try...with
uttrycket, uttrycket som används för undantagshantering i F#.
Syntax
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Kommentarer
Uttrycket try...with
används för att hantera undantag i F#. Den liknar -instruktionen try...catch
i C#. I föregående syntax kan koden i expression1 generera ett undantag. Uttrycket try...with
returnerar ett värde. Om inget undantag utlöses returnerar hela uttrycket värdet för expression1. Om ett undantag utlöses jämförs varje mönster i sin tur med undantaget, och för det första matchande mönstret körs motsvarande uttryck, som kallas undantagshanterare, för den grenen, och det övergripande uttrycket returnerar värdet för uttrycket i undantagshanteraren. Om inget mönster matchar sprids undantaget upp i anropsstacken tills en matchande hanterare hittas. De typer av värden som returneras från varje uttryck i undantagshanterarna måste matcha den typ som returneras från uttrycket i try
blocket.
Ofta innebär det faktum att ett fel också uppstod att det inte finns något giltigt värde som kan returneras från uttrycken i varje undantagshanterare. Ett vanligt mönster är att uttryckets typ ska vara en alternativtyp. Följande kodexempel illustrerar det här mönstret.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
Undantag kan vara .NET-undantag eller F#-undantag. Du kan definiera F#-undantag med hjälp av nyckelordet exception
.
Du kan använda en mängd olika mönster för att filtrera efter undantagstyp och andra villkor. alternativen sammanfattas i följande tabell.
Mönster | beskrivning |
---|---|
:? undantagstyp | Matchar den angivna .NET-undantagstypen. |
:? undantagstyp som identifierare | Matchar den angivna .NET-undantagstypen, men ger undantaget ett namngivet värde. |
exception-name(arguments) | Matchar en F#-undantagstyp och binder argumenten. |
identifierare | Matchar alla undantag och binder namnet till undantagsobjektet. Motsvarar :? System.Exception somidentifierare |
identifierare när villkor | Matchar alla undantag om villkoret är sant. |
Exempel
Följande kodexempel illustrerar användningen av de olika undantagshanterarmönstren.
// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
try
Some( x / y )
with
| :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None
// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
try
x / y
with
| ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
| ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1
let result2 = divide3 100 0 true
// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int
let function1 x y =
try
if x = y then raise (Error1("x"))
else raise (Error2("x", 10))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
function1 10 10
function1 9 2
Kommentar
Konstruktionen try...with
är ett separat uttryck från uttrycket try...finally
. Om koden kräver både ett with
block och ett finally
block måste du därför kapsla de två uttrycken.
Kommentar
Du kan använda try...with
i asynkrona uttryck, uppgiftsuttryck och andra beräkningsuttryck, i vilket fall en anpassad version av try...with
uttrycket används. Mer information finns i Asynkrona uttryck, uppgiftsuttryck och beräkningsuttryck.