다음을 통해 공유


예외: 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 식이 사용됩니다. 자세한 내용은 비동기 식, 작업 식계산 식을 참조하세요.

참고 항목