Исключения: выражение try...with

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

Синтаксис

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

Замечания

Выражение try...with используется для обработки исключений в F#. Он похож на инструкцию try...catch в C#. В предыдущем синтаксисе код в выражении1 может создать исключение. Выражение try...with возвращает значение. Если исключение не возникает, целое выражение возвращает значение expression1. Если создается исключение, каждый шаблон сравнивается в свою очередь с исключением и для первого соответствующего шаблона, соответствующего выражения, известного как обработчик исключений, для этой ветви выполняется, а общее выражение возвращает значение выражения в этом обработчике исключений. Если шаблон не совпадает, исключение распространяется на стек вызовов до тех пор, пока не будет найден соответствующий обработчик. Типы значений, возвращаемых из каждого выражения в обработчиках исключений, должны соответствовать типу, возвращаемого из выражения в блоке try .

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

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

let result1 = divide1 100 0

Исключения могут быть исключениями .NET или могут быть исключениями F#. Исключения F# можно определить с помощью exception ключевое слово.

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

Расписание Description
:? тип исключения Соответствует указанному типу исключения .NET.
:? тип исключения в качестве идентификатора Соответствует указанному типу исключения .NET, но предоставляет исключение именованного значения.
exception-name(arguments) Соответствует типу исключения F# и привязывает аргументы.
идентификатор Соответствует любому исключению и привязывает имя к объекту исключения. Эквивалент :? System.Exception в качествеидентификатора
идентификатор при условии Соответствует любому исключению, если условие имеет значение true.

Примеры

В следующих примерах кода показано использование различных шаблонов обработчика исключений.

// This example shows the use of the as keyword to assign a name to a
// .NET exception.
let divide2 x y =
  try
    Some( x / y )
  with
    | :? System.DivideByZeroException as ex -> printfn "Exception! %s " (ex.Message); None

// This version shows the use of a condition to branch to multiple paths
// with the same exception.
let divide3 x y flag =
  try
     x / y
  with
     | ex when flag -> printfn "TRUE: %s" (ex.ToString()); 0
     | ex when not flag -> printfn "FALSE: %s" (ex.ToString()); 1

let result2 = divide3 100 0 true

// This version shows the use of F# exceptions.
exception Error1 of string
exception Error2 of string * int

let function1 x y =
   try
      if x = y then raise (Error1("x"))
      else raise (Error2("x", 10))
   with
      | Error1(str) -> printfn "Error1 %s" str
      | Error2(str, i) -> printfn "Error2 %s %d" str i

function1 10 10
function1 9 2

Примечание.

Конструкция try...with — это отдельное выражение от try...finally выражения. Таким образом, если для кода требуется как блок, так with и finally блок, необходимо вложить два выражения.

Примечание.

В асинхронных выражениях, выражениях задач и других вычислительных выражениях можно использовать try...with настраиваемую версию try...with выражения. Дополнительные сведения см. в разделе "Асинхронные выражения", "Выражения задач" и "Вычисления".

См. также