Исключением является проблема, возникающая при выполнении программы. Исключение 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
Следующая программа показывает базовую обработку исключений с простой попыткой… с блоком —
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 .
Следующий пример демонстрирует это —
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. …
В зависимости от системы также будет отображаться некоторая другая информация о файле и переменной, вызывающей ошибку в системе.