예외: 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#)을 참조하십시오.

참고 항목

참조

예외 형식(F#)

예외: try...finally 식(F#)

기타 리소스

예외 처리(F#)