2012-10-04 49 views
4

我正在使用try ... catch塊。顯示英語語言環境中的所有例外

當我設置以下

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US"); 
      Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); 

它負責所有的異常,並將它們打印在英語

但失敗了很多API的內部尤其是對於像抓目錄訪問的人例外。還有什麼需要做的嗎?

所以主要的問題是這樣的Execption

System.Net.Sockets.SocketException (0x80004005): 

在此之後,消息未出現在區域設置

+0

我不確定,但認爲異常的語言環境也綁定到已安裝的.NET框架和系統語言。 – dowhilefor

+0

請不要在問題標題中添加標籤。 –

+0

這是我見過的最糟糕的問題。如果它真的意味着「但這失敗了?」那就試試吧。如果它真的意味着「但是這失敗了!」那麼請記住,當異常被拋出時,文化必須有效,而不是被捕獲。 –

回答

1

我能夠通過使用要做到這一點的Win32的FormatMessage代碼塊

[DllImport("Kernel32.dll", SetLastError=true)] 
static extern uint FormatMessage(uint dwFlags, IntPtr lpSource, 
    uint dwMessageId, uint dwLanguageId, ref IntPtr lpBuffer, 
    uint nSize, string[] Arguments); 

,並通過設置LANGID英語!

+0

呃......請多說明一下? – Nyerguds

0

這個問題可以到處部分工作。框架異常代碼基於當前線程區域設置從其資源加載錯誤消息。在一些例外的情況下,這發生在Message屬性被訪問時。

對於這些例外情況,您可以通過在記錄日誌時簡單地將線程區域設置切換到en-US來獲取完整的美國英語版本的消息(預先保存原始用戶區域設置並在之後立即恢復)。

在一個單獨的線程上做到這一點甚至更好:這確保不會有任何副作用。

參考:Exception messages in English?

0

不要選擇培養用戶。讓他自己做。
在極少數情況下,當您必須使用預定義的文化,但在大多數情況下,這是用戶的業務 - 使用哪種文化。

+5

我無法更強烈地反對。這不是爲用戶選擇文化的情況,因爲例外文本對用戶不利。許多程序會捕獲所有異常,並彈出一個錯誤報告對話框,讓您將報告發送給開發人員。我該怎麼處理一個怪異的俄羅斯或韓國的異常信息?它們是沒用的,用戶不需要看到它們。 –