Исключения: выражение 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
выражения. Дополнительные сведения см. в разделе "Асинхронные выражения", "Выражения задач" и "Вычисления".