2018. 7. 17. 15:30

트라이~캐치(try~catch)는 런타임에서 오류를 잡아내는 좋은 방법의 하나 입니다.

문제는 디버그할 때는 오류 위치가 잡히지 않기 때문에 오류 추적이 힘들다는 문제가 있죠.

 

1. 트라이 캐치도 조건문을 사용할 수 있다.

캐치(catch)에 조건을 줘서 원하는 조건에 중단 점이 동작하도록 할 수 있습니다.

캐치문 뒤에 웬(when)문을 붙여 사용할 수 있습니다.

(참고 : Microsoft docs - try-catch(C# 참조) )

 


catch (ArgumentException e) when (e.ParamName == "…")  
{  
}  

 

 

이런 식으로 말이죠.

 

2. 활용하기

간단하게 예제를 만들어 봅시다.

 

버튼을 몇 개 만들고 시작 버튼을 하나 만듭니다.

 

 

 

버튼들은 변수의 상태를 바꿔주는 기능을 넣고

시작 버튼은 일부로 에러를 내는 상황을 만들겠습니다.

private bool m_bDebug = true;

private void btnDebug_Click(object sender, EventArgs e)
{
    this.m_bDebug = true;
}

private void btnRelease_Click(object sender, EventArgs e)
{
    this.m_bDebug = false;
}

private void btnStart_Click(object sender, EventArgs e)
{
    object o2 = null;
    try
    {
        int i2 = (int)o2;   // Error  
    }
    catch (Exception ex) when (m_bDebug == false)
    {
        MessageBox.Show("에러가 났습니다.");
    }
}

 

 

 

 

이제 테스트해봅시다.

 

 

 

'm_bDebug'가 'true'이면 에러 위치에서 자동으로 중단되고

'm_bDebug'가 'false'이면 캐치가 동작합니다.

 

3. 디버그 판단하기

디버그(debug)인지 릴리즈(release)인지 판단하는 건 디버그 심벌을 이용하면 됩니다.

 


#if DEBUG
    private bool m_bDebug = true;
#else
    private bool m_bDebug = false;
#endif

 

 

이렇게 하면 빌드 구성에 따라 트라이 캐치를 동작 시킬 수 있습니다.

 

마무리

이렇게 편한 기능을.......모르고 있었다가 얼마 전에야 알았습니다 ㅋㅋㅋㅋㅋㅋㅋ

닷넷으로 밥 벌어 먹은 게 얼마인데 이제야 알다니 ㅋㅋㅋㅋㅋㅋ

 

셈플 프로젝트 : TryCatchTest.zip

 

 

 

    
      // This is some random code
      var foo = "bar"