다음을 통해 공유


예외: try...finally 식

try...finally 식을 사용하면 코드 블록이 예외를 throw하더라도 클린-up 코드를 실행할 수 있습니다.

구문

try
    expression1
finally
    expression2

설명

try...finally 1을 실행하는 동안 예외가 생성되었는지 여부에 관계없이 식은 이전 구문의 expression2에서 코드를 실행하는 데 사용할 수 있습니다.

expression2형식은 전체 식의 값에 영향을 주지 않습니다. 예외가 발생하지 않을 때 반환되는 형식은 expression1의 마지막 값입니다. 예외가 발생하면 값이 반환되지 않고 제어 흐름이 호출 스택 위로 일치하는 다음 예외 처리기로 전송됩니다. 예외 처리기를 찾을 수 없으면 프로그램이 종료됩니다. 일치하는 처리기의 코드가 실행되거나 프로그램이 종료되기 전에 분기의 finally 코드가 실행됩니다.

다음 코드에서는 식을 사용하는 방법을 보여 줍니다 try...finally .

let divide x y =
   let stream : System.IO.FileStream = System.IO.File.Create("test.txt")
   let writer : System.IO.StreamWriter = new System.IO.StreamWriter(stream)
   try
      writer.WriteLine("test1")
      Some( x / y )
   finally
      writer.Flush()
      printfn "Closing stream"
      stream.Close()

let result =
  try
     divide 100 0
  with
     | :? System.DivideByZeroException -> printfn "Exception handled."; None

콘솔에 대한 출력은 다음과 같습니다.

Closing stream
Exception handled.

출력에서 볼 수 있듯이 외부 예외가 처리되기 전에 스트림이 닫혔으며, 예외가 제어를 외부 예외 처리기로 전송했음에도 불구하고 버퍼가 플러시되고 디스크에 기록되었음을 나타내는 텍스트test1가 파일에 test.txt 포함됩니다.

try...with 구문은 구문과 별도의 구문입니다try...finally. 따라서 코드에 블록과 블록이 모두 with 필요한 경우 다음 코드 예제와 finally 같이 두 구문을 중첩해야 합니다.

exception InnerError of string
exception OuterError of string

let function1 x y =
   try
     try
        if x = y then raise (InnerError("inner"))
        else raise (OuterError("outer"))
     with
      | InnerError(str) -> printfn "Error1 %s" str
   finally
      printfn "Always print this."


let function2 x y =
  try
     function1 x y
  with
     | OuterError(str) -> printfn "Error2 %s" str

function2 100 100
function2 100 10

시퀀스 식 및 비동기 식을 비롯한 계산 식의 컨텍스트에서 다음을 시도합니다 . 마지막으로 식에는 사용자 지정 구현이 있을 수 있습니다. 자세한 내용은 계산 식을 참조 하세요.

참고 항목