此应用程序测试硬件并将测试结果打印到控制台。多个设备可以同时进行测试,因此我有多个线程并锁定对控制台的访问,包括输入和输出。因此,在将结果传递给打印的函数之前,我最初在我的代码中有这个:
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的指示。
答案 0 :(得分:2)
正如Daniel James Bryars已经说过,遇到ReSharper:
此行上的警告,因为第二个参数从未在格式字符串中使用(由于缺少;
而导致一个错误)。
您甚至可以使用此功能使用属性标记您自己的代码或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)