F # - obsługa wyjątków
Wyjątkiem jest problem, który pojawia się podczas wykonywania programu. Wyjątek F # jest odpowiedzią na wyjątkowe okoliczności, które pojawiają się podczas działania programu, na przykład próbę podzielenia przez zero.
Wyjątki umożliwiają przekazanie kontroli z jednej części programu do drugiej. Obsługa wyjątków F # zapewnia następujące konstrukcje -
Zbudować | Opis |
---|---|
podnieść wyr | Podnosi podany wyjątek. |
failwith expr | Podnosi System.Exception wyjątek. |
spróbuj wyrażenie z regułami | Łapie wyrażenia pasujące do reguł wzorców. |
spróbuj wyrażenie w końcu wyr | Wykonanie finally wyrażenie zarówno w przypadku pomyślnego obliczenia, jak i w przypadku zgłoszenia wyjątku. |
| :? ArgumentException | Reguła pasująca do danego typu wyjątku .NET. |
| :? ArgumentException jako e | Reguła pasująca do danego typu wyjątku .NET, wiążąca nazwę e do wartości obiektu wyjątku. |
| Błąd (msg) → wyr | Reguła pasująca do danego wyjątku F # przenoszącego dane. |
| exn → wyr | Reguła pasująca do każdego wyjątku, wiążąca nazwę exn do wartości obiektu wyjątku. |
| exn when expr → expr | Reguła pasująca do wyjątku pod zadanym warunkiem, wiążąca nazwę exn do wartości obiektu wyjątku. |
Zacznijmy od podstawowej składni obsługi wyjątków.
Składnia
Podstawowa składnia dla bloku obsługi wyjątków F # to -
exception exception-type of argument-type
Gdzie,
exception-type to nazwa nowego typu wyjątku F #.
argument-type reprezentuje typ argumentu, który można podać, gdy zgłosisz wyjątek tego typu.
Można określić wiele argumentów, używając typu krotki dla typu argumentu.
Plik try...with wyrażenie jest używane do obsługi wyjątków w języku F #.
Składnia try… z wyrażeniem to -
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
Plik try...finally wyrażenie umożliwia wykonanie czystego kodu, nawet jeśli blok kodu zgłasza wyjątek.
Składnia try… na końcu wyrażenie to -
try
expression1
finally
expression2
Plik raiseFunkcja służy do wskazania, że wystąpił błąd lub wyjątkowy stan. Przechwytuje również informacje o błędzie w obiekcie wyjątku.
Składnia funkcji podbicia to -
raise (expression)
Plik failwith funkcja generuje wyjątek F #.
Składnia funkcji failwith to -
failwith error-message-string
Plik invalidArg funkcja generuje wyjątek argumentu.
invalidArg parameter-name error-message-string
Przykład obsługi wyjątków
Przykład 1
Poniższy program przedstawia podstawową obsługę wyjątków za pomocą prostego try… with block -
let divisionprog x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divisionprog 100 0
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Division by zero!
Przykład 2
F # zapewnia exceptionwpisz do deklarowania wyjątków. Możesz użyć typu wyjątku bezpośrednio w filtrach w plikutry...with wyrażenie.
Poniższy przykład demonstruje to -
exception Error1 of string
// Using a tuple type as the argument type.
exception Error2 of string * int
let myfunction x y =
try
if x = y then raise (Error1("Equal Number Error"))
else raise (Error2("Error Not detected", 100))
with
| Error1(str) -> printfn "Error1 %s" str
| Error2(str, i) -> printfn "Error2 %s %d" str i
myfunction 20 10
myfunction 5 5
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Error2 Error Not detected 100
Error1 Equal Number Error
Przykład 3
Poniższy przykład demonstruje obsługę zagnieżdżonych wyjątków -
exception InnerError of string
exception OuterError of string
let func1 x y =
try
try
if x = y then raise (InnerError("inner error"))
else raise (OuterError("outer error"))
with
| InnerError(str) -> printfn "Error:%s" str
finally
printfn "From the finally block."
let func2 x y =
try
func1 x y
with
| OuterError(str) -> printfn "Error: %s" str
func2 100 150
func2 100 100
func2 100 120
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
From the finally block.
Error: outer error
Error:inner error
From the finally block.
From the finally block.
Error: outer error
Przykład 4
Poniższa funkcja demonstruje failwith funkcja -
let divisionFunc x y =
if (y = 0) then failwith "Divisor cannot be zero."
else
x / y
let trydivisionFunc x y =
try
divisionFunc x y
with
| Failure(msg) -> printfn "%s" msg; 0
let result1 = trydivisionFunc 100 0
let result2 = trydivisionFunc 100 4
printfn "%A" result1
printfn "%A" result2
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Divisor cannot be zero.
0
25
Przykład 5
Plik invalidArgfunkcja generuje wyjątek argumentu. Poniższy program demonstruje to -
let days = [| "Sunday"; "Monday"; "Tuesday"; "Wednesday"; "Thursday"; "Friday"; "Saturday" |]
let findDay day =
if (day > 7 || day < 1)
then invalidArg "day" (sprintf "You have entered %d." day)
days.[day - 1]
printfn "%s" (findDay 1)
printfn "%s" (findDay 5)
printfn "%s" (findDay 9)
Kiedy kompilujesz i wykonujesz program, daje to następujące dane wyjściowe -
Sunday
Thursday
Unhandled Exception:
System.ArgumentException: You have entered 9.
…
W zależności od systemu zostaną również wyświetlone inne informacje o pliku i zmiennej powodującej błąd w systemie.