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