Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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
...
Anmärkningar
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
Anmärkning
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.
Anmärkning
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.