코드의 수백 곳에서 사용되는 간단한 유틸리티 기능이 있다고 상상해보십시오.
decimal Inverse(decimal input)
{
return 1 / input;
}
우리가 제안한대로해야한다면
decimal Inverse(decimal input)
{
try
{
return 1 / input;
}
catch(Exception ex)
{
log.Write("Error 27349262 occurred.");
}
}
입력이 0 인 경우 발생할 수있는 오류입니다. 이로 인해 0으로 나누기 예외가 발생합니다.
출력 또는 로그에 27349262가 있다고 가정 해 봅시다. 0 값을 전달한 코드를 어디에서 찾습니까? 고유 한 ID를 가진 기능은 수백 곳에서 사용됩니다. 따라서 0으로 나누기가 발생했다는 것을 알 수 있지만 누구인지 알 수 없습니다 0
.
메시지 ID를 기록하지 않으려면 스택 추적을 기록하십시오.
스택 추적의 세부 정보가 귀찮은 경우 런타임에서 제공하는 방식으로 문자열로 덤프하지 않아도됩니다. 사용자 정의 할 수 있습니다. 예를 들어 약식 스택 추적을 n
레벨 로만 원한다면 다음과 같이 작성할 수 있습니다 (c #을 사용하는 경우).
static class ExtensionMethods
{
public static string LimitedStackTrace(this Exception input, int layers)
{
return string.Join
(
">",
new StackTrace(input)
.GetFrames()
.Take(layers)
.Select
(
f => f.GetMethod()
)
.Select
(
m => string.Format
(
"{0}.{1}",
m.DeclaringType,
m.Name
)
)
.Reverse()
);
}
}
그리고 이것을 다음과 같이 사용하십시오 :
public class Haystack
{
public static void Needle()
{
throw new Exception("ZOMG WHERE DID I GO WRONG???!");
}
private static void Test()
{
Needle();
}
public static void Main()
{
try
{
Test();
}
catch(System.Exception e)
{
//Get 3 levels of stack trace
Console.WriteLine
(
"Error '{0}' at {1}",
e.Message,
e.LimitedStackTrace(3)
);
}
}
}
산출:
Error 'ZOMG WHERE DID I GO WRONG???!' at Haystack.Main>Haystack.Test>Haystack.Needle
메시지 ID를 유지하는 것보다 쉽고 유연합니다.
DotNetFiddle에서 내 코드를 훔치십시오