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
블록 사용이 가비지 수집을 기다리는 것보다 더 낫습니다.
참고 항목
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기