.NET에서 오류를 캐치하기 위한 방법으로 'Debug.Assert'과 'throw Exception' 이렇게 두 가지가 있습니다.
이 두가지의 차이와 활용방법을 알아봅시다.
'Debug.Assert'는 조건이 펄스(false)일 때 동작하는 메소드 입니다.
이 동작이 중요한데 'Debug.Assert'의 용도는 '확인'에 있으므로 거짓일 때 동작한다고 생각하면 됩니다.
'Debug.Assert'가 동작하면 메시지 상자가 표시됩니다.
Debug.Assert([비교값], "[출력할 메시지]");
'Trace.Assert'도 같은 동작을 합니다.
디버그는 디버그 모드에서만 동작하고 트레이스는 모두 동작합니다.
(참고 : 디버그(Debug) 클래스와 트레이스(Trace) 클래스)
'Debug.Assert'은 개발자에게 알리는 오류라고 생각하고 활용하는 것이 좋습니다.
어떻게 보면 'Debug.Assert'는 사용하지 않아야 합니다.
'Debug.Assert'가 필요한 경우라면 예상 가능한 모든 예외를 처리해 두었다는 의미가 되기 때문입니다.
문제는 예상하지 못한 오류가 났을 때고 이럴 때를 대비하여 미리 깔아두는 용도로 사용하는 것이 'Debug.Assert'입니다.
대표적으로 필요한 곳이 함수의 매개변수 검증과 리턴전 데이터 검증입니다.
단지 설계대로 매개변수와 리턴값이 나올 수밖에 없는 상황이라면 이런 코드를 깔아둘 이유가 없죠.
'throw Exception'는 디버그 모드에서는 중단점 처럼 동작합니다.
릴리즈 모드에서는 오류를 표시하고 프로그램을 종료시킵니다.
(참고 : MSDN - 예외 만들기 및 Throw(C# 프로그래밍 가이드), Exception 클래스 )
throw new Exception("[표시할 메시지]");
'throw Exception'의 가장 큰 특징은 'try catch'로 잡아낼 수 있다는 점입니다.
이 특징을 이용하여 오류를 핸들링해야 합니다.
사용자에게 알리는 오류를 처리할 때 주로 사용합니다.
예상 가능한 오류를 처리할 때 쓰입니다.
예> 우리 팀이 dll을 개발하는 팀이라면 dll을 사용하는 개발자에게 알리는 오류입니다.
쓰루를 던지고 트라이케치로 받으면 goto와 비슷한 구조로 만들 수 있습니다.
원례 좋은 설계라면 트라이케치가 없어야 겠지만 예외상황은 언제나 일어나죠 ㅎㅎㅎㅎ
시작점에 트라이 캐치를 걸고 모든 오류를 'throw Exception'로 처리하는 꼼수도 있습니다.
프로그램이 어떠 상황에서도 죽으면 안 되는 경우 유용하게 사용할 수 있습니다.
위에서 말한 goto로 오류처리를 하게 되는 것이죠.
클래스 라이브러리 프로젝트를 생성한 다음 클래스를 하나 생성하여 아래 코드를 넣습니다.
public bool CallAssert(int? nCompare)
{
//매개변수 검증
//Debug.Assert( null != nCompare, "값은 null이면 안됩니다.");
Trace.Assert(null != nCompare, "값은 null이면 안됩니다.");
bool bReturn = nCompare > this.m_nValue;
//리턴값 검증
Debug.Assert(bReturn, string.Format("값이 너무 작습니다. {0} > {1}", nCompare, this.m_nValue));
return bReturn;
}
public bool CallException(int? nCompare)
{
//매개변수 검증
if (null == nCompare)
{
throw new Exception("값은 null이면 안됩니다.");
}
bool bReturn = nCompare > this.m_nValue;
//리턴값 검증
if (false == bReturn)
{
throw new Exception(string.Format("값이 너무 작습니다. {0} > {1}", nCompare, this.m_nValue));
}
return bReturn;
}
테스트용 윈폼이나 콘솔프로그램을 만든 후 테스트를 해봅시다.
매번 별생각 없이 쓰고 있었는데....
뭔가 검색하다가 갑자기 두 개의 차이를 정리해야겠다는 생각이 들어서 정리해 봅니다.