[英]String.Format mistyping parameters
該應用程序測試硬件並將測試結果打印到控制台。 可以同時測試多個設備,因此我擁有多個線程,並且鎖定了對控制台的訪問,包括輸入和輸出。 因此,在將結果傳遞給要打印的函數之前,我本來就在代碼中使用了它:
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
特有的問題。 在單獨的線程中引發異常的任何函數都會遇到相同的問題。
感謝您的再次清晰指針和編輯@ VirtualBlackFox 。
正如Daniel James Bryars所說,與ReSharper會面:
2在該行上的警告作為第二個參數從未在格式字符串中使用(並且由於缺少;
而導致一個錯誤)。
您甚至可以使用此功能通過屬性標記自己的代碼或外部代碼(例如NLog)。
警告在滾動條上聚合為彩色線條,在單獨的窗口中可用,並且可以將其集成到幾乎任何自動化系統中(例如Sonar )
這將引發錯誤,因為{2}
實際上是指字符串之后的第三個參數。 由於您只有兩個,因此將引發異常。
string message = String.Format("The DUT is: {0}. The total test " +
"was a : {1}.", MAC, testResultString);
只要您的令牌引用不超過您的參數計數,您就不必擔心對String.Format
錯誤處理。
該問題並非特定於String.Format
。 從后台線程拋出的幾乎所有異常都將導致相同的問題。
您可以考慮AppDomain.UnhandledException
捕獲並報告此類異常:
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
Exception x = (Exception)e.ExceptionObject;
// report error, etc.
};
但是有很多細節需要注意,請參閱http://msdn.microsoft.com/zh-cn/library/system.appdomain.unhandledexception%28v=vs.110%29.aspx 。
PS此頁面很好地概述了各種可能性: WPF全局異常處理程序
如果使用VS,則可能需要在調試菜單下啟用這些異常。 如果參數數量小於所使用的任何索引,則String.Format確實會引發異常。 查看MSDN頁面 。
更新:更具體地說,您需要從CLR(公共語言運行時)啟用異常。
為什么不嘗試以下方法:
string message = String.Format("The DUT is: {0}. The total test was a : {1}.", MAC, testResultString);
我希望這有幫助! SLaks在評論中說! 添加一個try / catch來檢查異常;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.