C# 字符串.格式错误键入参数

C# 字符串.格式错误键入参数,c#,.net,C#,.net,此应用程序测试硬件并将测试结果打印到控制台。可以同时测试多个设备,因此我有多个线程,并锁定对控制台的访问,包括输入和输出。因此,在将结果传递给打印的函数之前,我最初在代码中包含了这一点: string message = String.Format("The DUT is: {0}. The total test " + "was a : {2}.", MAC, testResultString); 2导致应用程序停止执行该函数。它将控制权切换回其他线程,但从不抱怨错误等,因此问题需要花费相当

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

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
静默失败。正如@正确指出的,这不是
String.Format
特有的问题。单独线程中引发异常的任何函数都会有相同的问题


谢谢你在Re sharper上的提示和编辑@

如果您正在使用VS,则可能需要在“调试”菜单下启用这些异常。如果参数的数量小于使用的任何索引,则String.Format会引发异常。看


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

如果您使用VS,则可能需要在“调试”菜单下启用这些异常。如果参数的数量小于使用的任何索引,则String.Format会引发异常。看


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

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

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

只要您的令牌引用不超过参数计数,您就不必担心
字符串.Format

上的错误处理,这将引发错误,因为
{2}
实际上是指字符串后面的第三个参数。因为您只有两个,所以它会抛出一个异常

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

只要您的令牌引用不超过您的参数计数,您就不必担心
字符串.Format

上的错误处理,为什么不尝试以下方法:

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

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

你为什么不试试这样的方法:

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

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

问题不特定于
String.Format
。几乎所有从后台线程抛出的异常都会导致相同的问题

您可以考虑<代码> AppDeals.UnHuntLebug > /Cord>来捕获和报告这样的异常:

AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
    Exception x = (Exception)e.ExceptionObject;
    // report error, etc.
};
但是有很多细节需要注意,请参见

p.S.本页提供了各种可能性的良好概述:

问题不特定于
字符串格式。几乎所有从后台线程抛出的异常都会导致相同的问题

您可以考虑<代码> AppDeals.UnHuntLebug > /Cord>来捕获和报告这样的异常:

AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
    Exception x = (Exception)e.ExceptionObject;
    // report error, etc.
};
但是有很多细节需要注意,请参见

p.S.本页提供了各种可能性的良好概述:

如前所述,满足:

这一行上有2条警告,因为第二个参数从未在格式字符串中使用(还有一条错误是由于缺少

您甚至可以使用属性标记自己的代码或外部代码(如NLog),以使用此功能

警告在滚动条上聚合为彩色线,可在单独的窗口中使用,并可集成到几乎任何自动系统中(例如)

如前所述,满足:

这一行上有2条警告,因为第二个参数从未在格式字符串中使用(还有一条错误是由于缺少

您甚至可以使用属性标记自己的代码或外部代码(如NLog),以使用此功能

警告在滚动条上聚合为彩色线,可在单独的窗口中使用,并可集成到几乎任何自动系统中(例如)

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

string message = $"The DUT is: {MAC}. The total test " +
"was a : {testResultString}.";
我不知道这是否是编译时检查的。

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

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

我不知道这是否是编译时检查。

这将引发异常。检查您的
catch
blocks.ReSharper,Jetbrains()的商业插件将为您发现此错误。这将引发异常。检查您的
catch
blocks.ReSharper,Jetbrains()的商业插件将为您发现此错误。