主题:【原创】乱侃软件工程师的素养 1 -- poorfat
再强调一下:别忘了留下痕迹,从程序所有可能的执行路径都要记得留下踪迹。
我有一次测试这样一段程序。用正面测试(positive tests)都是好的。一用反例来测试,就碰到问题了。
请看这段程序:(以下用伪码表示)
bool Run(executableName, ParamList, &fullCommandLine, &error)
{
if ( ShellExecute("cmd /c " + executableName + " " +ParamList) )
{
fullCommandLine = "cmd /c " + executableName + " " +ParamList;
return true;
}
error = GetShellError();
return false;
}
void RunCommandWithLogging(executableName, ParamList)
{
...
var cmdline = "";
var errorlevel = 0;
if ( Run(executableName + " " +ParamList, cmdline, errorlevel) )
{
log("the command line=[" + cmdline+"] has succeeded. ");
}
else
{
log("the command line=[" + cmdline+"] has failed. Errorlevel="+errorlevel);
}
...
}
诸位看出问题来没有?每当我用一个错误的命令放入RunCommandWithLogging()函数,我就看到日志文件里有这样一行:
the command line=[] has failed. Errorlevel=blah
没错,就是一对空的方括号[]。问题就在这里。当命令行有错误的时候,日志文件里就没有记录那条错误的命令行,而只有一对空的方括号。
为什么会这样呢?应为当ShellExecute()失败的时候,变量fullCommandLine没有被赋值。就这么简单。因此,Run()函数应该订正如下:
bool Run(executableName, ParamList, &fullCommandLine, &error)
{
if ( ShellExecute("cmd /c " + executableName + " " +ParamList) )
{
fullCommandLine = "cmd /c " + executableName + " " +ParamList;
return true;
}
else
{
fullCommandLine = "cmd /c " + executableName + " " +ParamList;
error = GetShellError();
return false;
}
}
这个案例的教训就是,如果你要记录日志,别忘了所有的代码路径(code path)都要留下日志。
- 相关回复 上下关系8
🙂【原创】乱侃软件工程师的素养 1 44 poorfat 字1438 2008-08-12 21:15:58
🙂曾在if判断里把一个正则表达式写成六行的菜鸟飘过 空格 字55 2011-01-18 01:14:08
🙂【原创】素养 (5) 留下痕迹案例2
🙂自顶旧文,聊以自勉 poorfat 字60 2011-01-09 10:05:19
🙂多谢多谢。让我想到西西河的一个问题,有了一些启发 铁手 字0 2008-08-27 16:23:28
🙂命令行赋值语句提出来放在第一行更好些吧? 不远攸高 字12 2008-08-21 21:19:23
🙂不见得,讨论一下 6 pix 字506 2008-08-14 15:28:23
🙂硬件发展到这个地步已经没有必要追求编程小技巧了 金口玉言 字124 2008-08-16 18:45:42