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