Учебники

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

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

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

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

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

Синтаксис

Основной синтаксис для блока обработки исключений F # —

exception exception-type of argument-type

Куда,

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

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

  • Несколько аргументов могут быть указаны с помощью типа кортежа для типа аргумента.

Тип исключения — это имя нового типа исключения F #.

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

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

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

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

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

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

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

try
   expression1
finally
   expression2

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

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

raise (expression)

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

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

failwith error-message-string

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

invalidArg parameter-name error-message-string

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

Пример 1

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

Live Demo

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 # предоставляет тип исключения для объявления исключений. Вы можете использовать тип исключения непосредственно в фильтрах в выражении try … with .

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

Live Demo

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

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

Live Demo

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

Live Demo

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 генерирует исключение аргумента. Следующая программа демонстрирует это —

Live Demo

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.
…

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