예외: try...with 식
이 항목에서는 F#의 try...with
예외 처리에 사용되는 식인 식에 대해 설명합니다.
구문
try
expression1
with
| pattern1 -> expression2
| pattern2 -> expression3
...
설명
식 try...with
은 F#에서 예외를 처리하는 데 사용됩니다. C#의 문과 try...catch
비슷합니다. 앞의 구문에서 expression1의 코드는 예외를 생성할 수 있습니다. 식은 try...with
값을 반환합니다. 예외가 throw되지 않으면 전체 식은 expression1의 값을 반환합니다. 예외가 throw되면 각 패턴이 차례로 예외와 비교되고, 첫 번째 일치 패턴의 경우 해당 분기에 대한 예외 처리기라고 하는 해당 식이 실행되고 전체 식은 해당 예외 처리기에서 식의 값을 반환합니다. 일치하는 패턴이 없으면 일치하는 처리기를 찾을 때까지 예외가 호출 스택 위로 전파됩니다. 예외 처리기의 각 식에서 반환되는 값의 형식은 블록의 식 try
에서 반환된 형식과 일치해야 합니다.
오류가 발생했다는 사실은 각 예외 처리기의 식에서 반환할 수 있는 유효한 값이 없다는 것을 의미하기도 합니다. 자주 사용하는 패턴은 식의 형식이 옵션 형식이 되도록 하는 것입니다. 다음 코드 예제에서는 이 패턴을 보여 줍니다.
let divide1 x y =
try
Some (x / y)
with
| :? System.DivideByZeroException -> printfn "Division by zero!"; None
let result1 = divide1 100 0
예외는 .NET 예외이거나 F# 예외일 수 있습니다. 키워드(keyword) 사용하여 F# 예외를 정의할 exception
수 있습니다.
다양한 패턴을 사용하여 예외 유형 및 기타 조건을 필터링할 수 있습니다. 옵션은 다음 표에 요약되어 있습니다.
패턴 | 설명 |
---|---|
:? exception-type | 지정된 .NET 예외 형식과 일치합니다. |
:? exception-type as identifier | 지정된 .NET 예외 형식과 일치하지만 예외에 명명된 값을 제공합니다. |
exception-name(arguments) | F# 예외 형식과 일치하고 인수를 바인딩합니다. |
identifier | 예외를 일치시키고 예외 개체에 이름을 바인딩합니다. :?에 해당합니까 ? 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
. 따라서 코드에 블록과 finally
블록이 모두 with
필요한 경우 두 식을 중첩해야 합니다.
참고 항목
비동기 식, 작업 식 및 기타 계산 식에서 사용할 try...with
수 있습니다. 이 경우 사용자 지정된 버전의 try...with
식이 사용됩니다. 자세한 내용은 비동기 식, 작업 식 및 계산 식을 참조하세요.
참고 항목
.NET