트라이~캐치(try~catch)는 런타임에서 오류를 잡아내는 좋은 방법의 하나 입니다.
문제는 디버그할 때는 오류 위치가 잡히지 않기 때문에 오류 추적이 힘들다는 문제가 있죠.
캐치(catch)에 조건을 줘서 원하는 조건에 중단 점이 동작하도록 할 수 있습니다.
캐치문 뒤에 웬(when)문을 붙여 사용할 수 있습니다.
(참고 : Microsoft docs - try-catch(C# 참조) )
catch (ArgumentException e) when (e.ParamName == "…")
{
}
이런 식으로 말이죠.
간단하게 예제를 만들어 봅시다.
버튼을 몇 개 만들고 시작 버튼을 하나 만듭니다.
버튼들은 변수의 상태를 바꿔주는 기능을 넣고
시작 버튼은 일부로 에러를 내는 상황을 만들겠습니다.
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'이면 캐치가 동작합니다.
디버그(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"