예외: 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
시퀀스 식 및 비동기 식을 비롯한 계산 식의 컨텍스트에서 다음을 시도합니다 . 마지막으로 식에는 사용자 지정 구현이 있을 수 있습니다. 자세한 내용은 계산 식을 참조 하세요.
참고 항목
.NET