2011-10-18 1 views
2

.NET의 코드 계약을 머리에 쓰려고합니다. 코드 계약을 사용할 때 어설 션을 어떻게 로그하여 문제의 메소드가 실패하게 할 수 있습니까? 예를 들어, 다음 코드를보십시오 :.NET 코드 계약에 로깅을 통합하는 방법

Public IsMatch(string x, string, y) 
{ 

    Contract.Assert(!string.IsNullOrWhiteSpace(x)); 
    Contract.Assert(!String.IsNullOrWhitespace(y)); 

     return x == y; 
} 

말하십시오. x = string.Empty. 그러면 메소드가 실패하게됩니다. assert가 위의 메소드를 실패하게 만드는 것을 어떻게 로그합니까? 나는 큰 app 안에 이것과 같은 많은 주장을 가질 수 있고, 그것이 문제 - 제작자 인 것을 아는 것이 좋을 것이다. 기본적으로 두 번째 매개 변수로이 메시지를 지정할 수 있습니다 http://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.contract.aspx

:에

답변

3

코드 계약을 사용하여 당연히해야 하는가?

로깅에 대해 이야기하는 중이라면 정적 확인보다는 런타임에 의미가 있다고 가정합니다.

어설 션은 실패 할 때 예외를 발생시킵니다. 당신은 예외를 기록하는 try/catch 블록을 작성할 수 있습니다

try 
{ 
    bool result = SomeClass.IsMatch(x, y); 
} 
catch(Exception e) 
{ 
    logger.Error(e.ToString()); // Use whatever logging mechanism here 
    throw; // Note: Make sure you rethrow if you catch "Exception e" 
} 

이 당신에게 선언이 실패한 라인을 가리 킵니다 예외의 스택 트레이스를 얻을 것이다.

정치가 언급했듯이 각 어설 션에 userMessage 매개 변수를 포함 할 수도 있습니다. 그렇게하면 로그에 스택 추적 외에 사용자 정의 오류 메시지가 포함됩니다.

좋은 logger 클래스가 필요한 경우 the NLog library을 확인하십시오.

+0

감사합니다. 이것은 Polity의 의견을 더 잘 설명하는 데 도움이됩니다. – Phil

3

봐.

그렇다면 Contract.Assert는 아주 원시적입니다. 사후 조건은 Contract.Requires를 사용하여 더 나은 방법을 확인할 수 있습니다.

편집 : 포스트 조건은 어떻게 실패 문제의 방법을 일으키는 어설를 기록 할 사전 조건

+0

+1이 좋은 조언이므로 +1하십시오. 또한 실제 응답을 기록하는 방법을 추가했습니다. 원한다면이 대답에 자유롭게 참여하십시오. 상당히 분명한 것입니다. –

+0

감사합니다. 나는 그 매뉴얼을 읽어야했다. – Phil