Task Exception을 밖에서 처리하는 방법

안녕하세요~

원하시는대로는 Task에서 나온 예외를 잡을 수 없습니다…

2가지 정도 방법이 떠올라서 전달 드립니다.

await를 붙이면 예외를 잡을 수 있습니다.

비동기 코드지만 동기 코드처럼 catch할 수 있습니다.

private async void button1_Click(object sender, EventArgs e)
{
    try
    {
        await TaskFuncAsync(); 
    }
    catch (Exception ex)
    {
    }
}

private async Task TaskFuncAsync()
{
    await Task.Run(() =>
    {
        throw new Exception("e");
    });
}

Task에 ContinueWith()를 사용한다.

Task객체가 끝난 후 반환값을 확인하는 방법입니다.
개인적으론 await 등장전엔 이 방법을 자주 사용했지만 await 등장 후 잘 사용하지 않는 패턴입니다.

  private void button3_Click(object sender, EventArgs e)
  {
      TaskFunc().ContinueWith(x =>
      {
          if (x.Exception != null)
          {
              // 예외가 있으면 여기 잡힘
          }
      });
  }

  private Task TaskFunc()
  {
      return Task.Run(() =>
      {
          throw new Exception("e");
      });
  }

이 방법이 아니라면… 함수를 호출하는 측에서 예외를 처리 하는 것이 아니라
직접 함수 안에서 try-catch를 사용하는 방법이 있을 것 같습니다.

도움이 되셨으면 좋겠네요!

7개의 좋아요