C# 6.0에서는 catch/finally 블럭에서 await 키워드를 사용할 수 있는 기능이 추가되었습니다. 이 기능을 사용하면, 예외가 발생하더라도 finally 블럭을 실행할 수 있습니다.
C# 5.0 이전 버전
C# 5.0 이전 버전에서는 catch/finally 블럭에서 await 키워드를 사용할 수 없었습니다. 따라서 예외가 발생하면 finally 블럭은 실행되지 않았습니다.
예를 들어, 다음과 같은 코드를 작성하면 예외가 발생하더라도 finally 블럭은 실행되지 않습니다.
async Task Main()
{
try
{
await Task.Run(() => { throw new Exception("예외가 발생했습니다."); });
}
catch (Exception ex)
{
// 예외 처리
}
finally
{
// finally 블럭
}
}
이 코드는 Task.Run() 메서드를 사용하여 비동기 작업을 실행합니다. 이 작업은 예외를 발생시키며, catch 블럭에서 예외를 처리합니다. 그러나 finally 블럭은 실행되지 않습니다.
await 사용하기
C# 6.0에서는 catch/finally 블럭에서 await 키워드를 사용할 수 있습니다. 이를 통해, 예외가 발생하더라도 finally 블럭을 실행할 수 있습니다.
예를 들어, 다음과 같은 코드를 작성하면 예외가 발생하더라도 finally 블럭이 실행됩니다.
async Task Main()
{
try
{
await Task.Run(() => { throw new Exception("예외가 발생했습니다."); });
}
catch (Exception ex)
{
// 예외 처리
}
finally
{
// finally 블럭
Console.WriteLine("finally 블럭이 실행되었습니다.");
}
}
이 코드는 catch 블럭에서 예외를 처리한 후 await 키워드를 사용하여 finally 블럭을 실행합니다. 따라서 finally 블럭은 항상 실행됩니다.
await 사용 시 주의점
catch/finally 블럭에서 await 키워드를 사용할 때는 다음과 같은 점에 유의해야 합니다.
- catch 블럭에서 await 키워드를 사용하면, 예외가 발생한 작업이 완료될 때까지 catch 블럭이 대기합니다.
- finally 블럭에서 await 키워드를 사용하면, finally 블럭이 실행될 때까지 await 키워드가 포함된 작업이 완료될 때까지 대기합니다.
예를 들어, 다음과 같은 코드를 작성하면 catch 블럭이 Task.Run() 메서드가 완료될 때까지 대기합니다.
async Task Main()
{
try
{
await Task.Run(() => { throw new Exception("예외가 발생했습니다."); });
}
catch (Exception ex)
{
// 예외 처리
// await 키워드를 사용하면 catch 블럭이 Task.Run() 메서드가 완료될 때까지 대기합니다.
await Task.Delay(1000);
}
finally
{
// finally 블럭
}
}
이 코드는 Task.Run() 메서드가 완료될 때까지 catch 블럭이 대기합니다. 따라서 finally 블럭은 Task.Run() 메서드가 완료된 후 실행됩니다.
결론
C# 6.0의 catch/finally 블럭에서 await 키워드를 사용하면, 예외가 발생하더라도 finally 블럭을 실행할 수 있습니다. 이를 통해, 예외가 발생했을 때에도 안전하게 자원을 해제할 수 있습니다.
'C#' 카테고리의 다른 글
C# 11.0의 required modifier (0) | 2023.11.10 |
---|---|
C# 6.0 정적 멤버 직접 사용 (2) | 2023.11.09 |
Microsoft.CodeAnalysis.LanguageServer client: couldn't create connection to server. (0) | 2023.10.27 |
C#의 정적 타입 정보 연산자 (0) | 2023.10.26 |
C# 람다 식 : 캡처 (0) | 2023.10.20 |