스택의 높은 부분 (Exception.StackTrace)이 잘리는 이유는 무엇입니까? 간단한 예제를 보자 :이 "디자인"처럼왜 스택이 Exception.StackTrace에서 잘리는가?
public void ExternalMethod()
{
InternalMethod();
}
public void InternalMethod()
{
try
{
throw new Exception();
}
catch(Exception ex)
{
// ex.StackTrace here doesn't contain ExternalMethod()!
}
}
것 같다. 그런 이상한 디자인의 이유는 무엇입니까? 로그 메시지에서 InternalMethod()를 호출 한 사람을 이해할 수 없으며 종종이 정보가 매우 필요하기 때문에 디버깅이 더 복잡해집니다.
해결책은 (모르는 사람들에게) 이해할 수있는 일반적인 해결책이 두 개 있습니다 :
1) 전체 스택을 포함하는 정적 Environment.StackTrace 속성을 로그 할 수 있습니다 (예 : 가장 높은 레벨 (메시지 큐)과 예외가 발생하는 가장 깊은 메소드에서 끝나는 것).
2) 우리는 최고 수준의 예외를 잡아서 기록해야합니다. 무언가를하기 위해 더 낮은 레벨에서 예외를 잡을 필요가있을 때, C#에서 "throw"문으로) 그것을 다시 일으켜 세워야합니다.
하지만 이러한 디자인의 이유에 대한 질문입니다.
개체가 누가 그것을 호출했는지에 대해 신경 써야합니까? 예외를 다시 던져야한다는 점에서 (2) 올바른 방법입니다. –
주로 스택 추적 정보가 디버깅 목적으로 예외와 함께 포함됩니다. 기존 설계로는 스택의 상위 부분도 가지고있는 것처럼 디버깅하는 데 도움이되지 않습니다. 다시 말하면, 누가이 메소드를 호출했는지 알면 디버깅에 매우 유용 할 수 있기 때문입니다. – nightcoder