簡體   English   中英

String.Format混淆參數

[英]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來檢查異常;)

在C#6中,您現在可以使用“字符串插值”(請參閱此處此處 )並執行以下操作:

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

而且我不知道這是否檢查了編譯時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM