如何在Console.Write()中警告错误的参数号?

时间:2011-12-21 11:35:00

标签: c# .net console

我们有一个包含数千行的程序,例如:

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个日志记录功能以查找难以发现的错误。

5 个答案:

答案 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);

这使您可以灵活地在方法中执行更多操作,而不仅仅是输出到控制台 - 您可能还想记录错误...然后您只需要更新单个方法以不同的格式输出/另一个地方。

此外,如果您尝试使用不正确的数量/类型的参数调用方法,则会出现编译错误。