다음을 통해 공유


finally를 사용하여 정리 코드를 실행하는 방법

finally 문은 예외가 throw된 경우에도 개체, 일반적으로 외부 리소스를 포함하는 개체의 필요한 정리가 즉시 수행되도록 합니다. 이러한 정리 작업의 한 가지 예로 다음과 같이 개체가 공용 언어 런타임에 의해 수집될 때까지 기다리지 않고 사용 후 즉시 FileStream에서 Close를 호출하는 것을 들 수 있습니다.

static void CodeWithoutCleanup()
{
    FileStream? file = null;
    FileInfo fileInfo = new FileInfo("./file.txt");

    file = fileInfo.OpenWrite();
    file.WriteByte(0xF);

    file.Close();
}

예시

이전 코드를 try-catch-finally 문으로 바꾸려면 다음과 같이 정리 코드와 작업 코드를 구분합니다.

static void CodeWithCleanup()
{
    FileStream? file = null;
    FileInfo? fileInfo = null;

    try
    {
        fileInfo = new FileInfo("./file.txt");

        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    catch (UnauthorizedAccessException e)
    {
        Console.WriteLine(e.Message);
    }
    finally
    {
        file?.Close();
    }
}

OpenWrite() 호출 또는 OpenWrite() 호출 자체가 실패하기 전에 try 블록 내에서 언제든지 예외가 발생할 수 있으므로 파일을 닫으려고 할 때 열려 있다는 보장은 없습니다. finally 블록은 검사를 추가하여 Close 메서드를 호출하기 전에 FileStream 개체가 null이 아닌지 확인합니다. null 검사가 없으면 finally 블록에서 고유한 NullReferenceException을 throw할 수 있지만 가능하면 finally 블록에서 예외를 throw하지 않도록 해야 합니다.

데이터베이스 연결은 finally 블록에서 닫기에 적합한 또 다른 후보입니다. 데이터베이스 서버에 허용되는 연결 수가 제한된 경우도 있으므로 최대한 빨리 데이터베이스 연결을 닫아야 합니다. 연결을 닫기 전에 예외가 throw되는 경우에도 finally 블록 사용이 가비지 수집을 기다리는 것보다 더 낫습니다.

참고 항목