C# 6.0의 catch/finally 블럭에서 await 사용

2023. 11. 8. 14:28·C#
반응형

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.  (1) 2023.10.27
C#의 정적 타입 정보 연산자  (0) 2023.10.26
C# 람다 식 : 캡처  (0) 2023.10.20
'C#' 카테고리의 다른 글
  • C# 11.0의 required modifier
  • C# 6.0 정적 멤버 직접 사용
  • Microsoft.CodeAnalysis.LanguageServer client: couldn't create connection to server.
  • C#의 정적 타입 정보 연산자
코샵
코샵
나의 코딩 일기장
    반응형
  • 코샵
    끄적끄적 코딩 공방
    코샵
    • 분류 전체보기 (720) N
      • 상품 추천 (220) N
      • MongoDB (4)
      • 하드웨어 (15) N
      • 일기장 (4)
      • Unity (138)
        • Tip (41)
        • Project (1)
        • Design Pattern (8)
        • Firebase (6)
        • Asset (2)
      • 파이썬 (13)
        • Basic (41)
        • OpenCV (8)
        • Pandas (15)
        • PyQT (3)
        • SBC(Single Board Computer) (1)
        • 크롤링 (14)
        • Fast API (29)
        • Package (6)
      • Linux (4)
      • C# (97)
        • Algorithm (11)
        • Window (7)
      • TypeScript (41)
        • CSS (10)
      • Git (11)
      • SQL (5)
      • Flutter (10)
        • Tip (1)
      • System (1)
      • BaekJoon (6)
      • Portfolio (2)
      • MacOS (1)
      • 유틸리티 (1)
      • 서비스 (6)
      • 자동화 (3)
      • Hobby (10)
        • 물생활 (10)
        • 식집사 (0)
  • 인기 글

  • 태그

    셀레니움
    codingtips
    C#
    유니티
    상품 리뷰 크롤링
    ipcamera
    카페24리뷰이관
    cv2
    rtsp
    스마트스토어리뷰
    긴유통기한우유
    믈레코비타멸균우유
    리뷰관리
    카페24리뷰
    codingcommunity
    쇼핑몰리뷰
    리스트
    리뷰이관
    list
    appdevelopment
    파이썬
    programmerlife
    devlife
    라떼우유
    programming101
    learntocode
    unity
    Python
    스크립트 실행
    스크립트 실행 순서
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코샵
C# 6.0의 catch/finally 블럭에서 await 사용
상단으로

티스토리툴바