F # - обработка исключений

Исключением является проблема, возникающая во время выполнения программы. Исключение F # - это реакция на исключительное обстоятельство, которое возникает во время работы программы, например при попытке деления на ноль.

Исключения позволяют передавать управление от одной части программы к другой. Обработка исключений F # предоставляет следующие конструкции:

Построить Описание
поднять выражение Вызывает данное исключение.
failwith expr Поднимает System.Exception исключение.
попробуйте выражение с правилами Отлавливает выражения, соответствующие шаблонным правилам.
попробуйте expr, наконец, expr Выполнение finally выражение как при успешном вычислении, так и при возникновении исключения.
| :? ArgumentException Правило, соответствующее данному типу исключения .NET.
| :? ArgumentException как e Правило, соответствующее данному типу исключения .NET, привязка имени e к значению объекта исключения.
| Ошибка (сообщение) → выражение Правило, соответствующее данному исключению F #, несущему данные.
| exn → expr Правило, соответствующее любому исключению, привязка имени exn к значению объекта исключения.
| exn, когда expr → expr Правило, соответствующее исключению при заданном условии, привязка имени exn к значению объекта исключения.

Начнем с базового синтаксиса обработки исключений.

Синтаксис

Базовый синтаксис для блока обработки исключений F # -

exception exception-type of argument-type

Где,

  • exception-type - это имя нового типа исключения F #.

  • argument-type представляет тип аргумента, который может быть предоставлен при возникновении исключения этого типа.

  • Можно указать несколько аргументов, используя тип кортежа для типа аргумента.

В try...with выражение используется для обработки исключений в языке F #.

Синтаксис для попытки… с выражением -

try
   expression1
with
   | pattern1 -> expression2
   | pattern2 -> expression3
...

В try...finally выражение позволяет выполнять код очистки, даже если блок кода вызывает исключение.

Синтаксис для выражения try… finally -

try
   expression1
finally
   expression2

В raiseФункция используется, чтобы указать, что произошла ошибка или исключительное состояние. Он также фиксирует информацию об ошибке в объекте исключения.

Синтаксис функции повышения -

raise (expression)

В failwith функция генерирует исключение F #.

Синтаксис функции failwith -

failwith error-message-string

В invalidArg функция генерирует исключение аргумента.

invalidArg parameter-name error-message-string

Пример обработки исключений

Пример 1

Следующая программа показывает базовую обработку исключений с помощью простой попытки ... с блоком -

let divisionprog x y =
   try
      Some (x / y)
   with
      | :? System.DivideByZeroException -> printfn "Division by zero!"; None

let result1 = divisionprog 100 0

Когда вы компилируете и выполняете программу, она дает следующий результат:

Division by zero!

Пример 2

F # предоставляет exceptionтип объявления исключений. Вы можете использовать тип исключения непосредственно в фильтрах вtry...with выражение.

Следующий пример демонстрирует это -

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

Когда вы компилируете и выполняете программу, она дает следующий результат:

Error2 Error Not detected 100
Error1 Equal Number Error

Пример 3

В следующем примере демонстрируется обработка вложенных исключений -

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

Когда вы компилируете и выполняете программу, она дает следующий результат:

From the finally block.
Error: outer error
Error:inner error
From the finally block.
From the finally block.
Error: outer error

Пример 4

Следующая функция демонстрирует failwith функция -

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

Когда вы компилируете и выполняете программу, она дает следующий результат:

Divisor cannot be zero.
0
25

Пример 5

В invalidArgфункция генерирует исключение аргумента. Следующая программа демонстрирует это -

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)

Когда вы компилируете и выполняете программу, она дает следующий результат:

Sunday
Thursday
Unhandled Exception:
System.ArgumentException: You have entered 9.
…

Некоторая другая информация о файле и переменной, вызывающих ошибку в системе, также будет отображаться в зависимости от системы.