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.