예외: try...with 식(F#)
이 항목에서는 try...with 식을 설명합니다. 이 식은 F# 언어에서 예외를 처리하는 데 사용됩니다.
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
설명
try...with 식은 F#에서 예외를 처리하는 데 사용됩니다. C#의 try...catch 문과 유사합니다. 위 구문에서 expression1의 코드 때문에 예외가 발생할 수 있습니다. try...with 식은 값을 반환합니다. 예외가 throw되지 않으면 전체 식이 expression1의 값을 반환합니다. 예외가 throw되면 각 pattern을 차례대로 예외와 비교한 다음 처음으로 일치하는 패턴이 발견되면 그에 상응하는 expression, 즉 예외 처리기를 해당 분기에 대해 실행합니다. 전체 식은 이 예외 처리기의 식을 통해 구한 값을 반환합니다. 일치하는 패턴이 발견되지 않으면 일치하는 처리기를 만날 때까지 예외가 호출 스택을 거슬러 올라가며 전파됩니다. 예외 처리기의 각 식을 통해 반환되는 값의 형식은 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 키워드를 사용하여 정의할 수 있습니다.
여러 가지 패턴을 사용하여 예외 형식과 기타 조건을 필터링할 수 있습니다. 다음 표에는 사용할 수 있는 옵션이 간략하게 정리되어 있습니다.
패턴 |
설명 |
---|---|
:? exception-type |
지정된 .NET 예외 형식에 일치시킵니다. |
:? exception-type as identifier |
지정된 .NET 예외 형식에 일치시키고 예외에 명명된 값을 부여합니다. |
exception-name(arguments) |
F# 예외 형식에 일치시키고 인수를 바인딩합니다. |
identifier |
모든 예외에 일치시키고 예외 개체에 이름을 바인딩합니다. :? System.Exception as 식별자와 동일 |
identifier when condition |
조건이 참인 경우 모든 예외에 일치시킵니다. |
예제
다음 코드 예제에서는 여러 가지 예외 처리기 패턴의 사용 방법을 보여 줍니다.
// 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#)을 참조하십시오.