假设您有一个琐碎的实用程序函数,该函数在代码中的数百个地方使用:
decimal Inverse(decimal input)
{
return 1 / input;
}
如果我们按照您的建议去做,我们可能会写
decimal Inverse(decimal input)
{
try
{
return 1 / input;
}
catch(Exception ex)
{
log.Write("Error 27349262 occurred.");
}
}
如果输入为零,则可能发生错误。这将导致被零除的异常。
假设您在输出或日志中看到27349262。您在哪里寻找通过零值的代码?请记住,具有唯一ID的功能已在数百个地方使用。因此,尽管您可能知道零被除,但是您不知道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窃取我的代码