Исключения: выражение 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#). |
См. также
Ссылки
Выражения: выражение try...finally (F#)