我们有一个包含数千行的程序,例如:
Console.Write("{0},{1} - {2}", e1, "My custom error", e2); // Write a custom error
但是,以下内容会引发错误,因为“{3}”大于参数数量:
Console.Write("{0},{1} - {3}", e1, "My custom error", e2); // Write a custom error
如何扫描整个项目以在编译时选择它?
更新
不幸的是,ReSharper无法运作。我已经创建了自己的日志类“w”,它在后台调用Console.Write和其他日志记录。 ReSharper在“Console.Write”中拾取错误,但忽略所述记录方法的任何参数。
更新
FXCop没有发现这种错误。这是令人惊讶的 - 为什么不选择一个明显的错误,这会导致整个程序崩溃并出现异常?
更新
感谢提示@adudley - 我最终在日志记录类中替换了所有“Console.Write”和“String.Format”实例,并调用了针对任何错误的try / catch专用版本。如果使用错误的参数调用单个很少使用的日志记录函数,则可以避免整个程序崩溃。我宁愿告诉程序确保其防弹,而不是手动检查1000个日志记录功能以查找难以发现的错误。
答案 0 :(得分:2)
商业ReSharper插件会自动发现错误(我认为您需要打开项目范围的检查)。有免费试用。
答案 1 :(得分:2)
我猜它可能是一些巨大的,未经测试的(可能是不可测试的!)遗留应用程序,但我会为单元测试(例如NUnit)抛出一个字 - 你可以使用它们与良好的测试双打库(像Rhino.Mocks)抛出各种错误并运用所有这些行。在修复之前,错误将显示为测试失败:)
答案 2 :(得分:2)
你必须问他们为什么会出错?在输入时它们应该是正确的,如果你翻译它们,请检查导入翻译的时间(这就是我们的工作)。
答案 3 :(得分:2)
静态代码分析可以为您做到这一点。如果您至少拥有Visual Studio的高级版本,则可以在项目设置中启用它。否则,您可以使用FxCop在构建后检查程序集。
这两个工具都有内置规则,应符合您的要求:Provide correct arguments to formatting methods
答案 4 :(得分:1)
我想这是一个完美的机会进行一些重构(如果你可以花点时间去做,当然 - 如果有成千上万的实例,可能需要一段时间;)
为什么不创建一个输出错误信息的静态方法,而不是在数千个地方进行相同的写操作,而不是......
public static void ShowError(string e1, string e2)
{
// possibly check for null / empty parameters if you need to.
Console.Write("{0},{1} - {2}", e1, "My custom error", e2);
}
并用
替换实例ShowError(e1, e2);
这使您可以灵活地在方法中执行更多操作,而不仅仅是输出到控制台 - 您可能还想记录错误...然后您只需要更新单个方法以不同的格式输出/另一个地方。
此外,如果您尝试使用不正确的数量/类型的参数调用方法,则会出现编译错误。