Поделиться через


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

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

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

Заметки

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

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

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.

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

Шаблон

Описание

:? exception-type

Соответствует указанному типу исключения .NET.

:? exception-type as identifier

Соответствует указанному типу исключения .NET, но присваивает исключению именованное значение.

exception-name(arguments)

Соответствует типу исключения F# и привязывает аргументы.

identifier

Соответствует любому исключению и привязывает имя к объекту исключения. Эквивалентно :? System.Exception as идентификатор

identifier when condition

Соответствует любому исключению, если условие имеет значение 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.Дополнительные сведения см. в разделах Асинхронные рабочие потоки (F#) и Выражения вычисления (F#).

См. также

Ссылки

Типы исключений (F#)

Выражения: выражение try...finally (F#)

Другие ресурсы

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