String.Format错误输入参数

时间:2014-02-27 21:44:46

标签: c# .net

此应用程序测试硬件并将测试结果打印到控制台。多个设备可以同时进行测试,因此我有多个线程并锁定对控制台的访问,包括输入和输出。因此,在将结果传递给打印的函数之前,我最初在我的代码中有这个:

string message = String.Format("The DUT is: {0}. The total test " +
"was a : {2}.", MAC, testResultString);

2导致应用程序停止执行该功能。它将控制权切换回其他线程,但从不抱怨错误等,因此问题花了很长时间才能找到。处理String.Format的好策略/最佳实践是什么,因为当出现问题时它显然很安静。或者具有类似灵活性的字符串格式的替代品。

编辑:是的,跟踪了错误并将代码更改为:

string message = String.Format("The DUT is: {0}. The total test " +
"was a : {1}.", MAC, testResultString);

问题的关键在于如何处理String.Format默默地失败。正如@ alexd正确指出的那样,这不是String.Format特有的问题。抛出异常的单独线程中的任何函数都会出现同样的问题。

感谢关于Re-sharper和编辑@ VirtualBlackFox的指示。

6 个答案:

答案 0 :(得分:2)

正如Daniel James Bryars已经说过,遇到ReSharper

enter image description here

此行上的警告,因为第二个参数从未在格式字符串中使用(由于缺少;而导致一个错误)。

您甚至可以使用此功能使用属性标记您自己的代码或NLog等外部代码。

警告在滚动条上汇总为彩色线条,可在单独的窗口中使用,并且几乎可以集成到任何自动化系统中(例如Sonar

答案 1 :(得分:1)

这会抛出错误,因为{2}实际上是指字符串后面的第三个参数。由于你只有两个,它会引发异常。

string message = String.Format("The DUT is: {0}. The total test " +
"was a : {1}.", MAC, testResultString);

只要您的令牌引用不超过您的参数计数,您就不必担心String.Format上的错误处理。

答案 2 :(得分:1)

问题并非针对String.Format。几乎任何从后台线程抛出的异常都会导致同样的问题。

您可以考虑AppDomain.UnhandledException来捕获并报告此类例外情况:

AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
    Exception x = (Exception)e.ExceptionObject;
    // report error, etc.
};

但有一些细节需要注意,请参阅http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception%28v=vs.110%29.aspx

P.S。此页面提供了可能性的概述: WPF global exception handler

答案 3 :(得分:0)

如果您使用VS,则可能需要在调试菜单下启用这些例外。如果参数的数量小于使用的任何索引,String.Format会抛出异常。请看the MSDN page

更新:更具体地说,您需要从CLR(公共语言运行时)启用例外。

答案 4 :(得分:0)

为什么不尝试类似的事情:

string message = String.Format("The DUT is: {0}. The total test was a : {1}.", MAC, testResultString);

我希望这有帮助! SLaks在评论中说!添加try / catch来检查异常;)

答案 5 :(得分:0)

在C#6中,您现在可以使用"字符串插值" (请参阅herehere)并执行以下操作:

string message = $"The DUT is: {MAC}. The total test " +
"was a : {testResultString}.";

我不知道如果这是编译时间。

相关问题