英语例外信息?

我们通过将Exception.Message写入文件来logging系统中发生的任何exception。 但是,他们是写在客户的文化。 而土耳其的错误对我来说并不重要。

那么如何在不改变用户文化的前提下,用英文logging任何错误信息呢?

这个问题可以部分解决。 框架exception代码根据当前线程区域设置从其资源加载错误消息。 在一些例外的情况下,这发生在Message属性被访问的时候。

对于这些例外情况,您可以通过简单地将线程语言环境切换到en-US来logging它(预先保存原始用户语言环境并在之后立即恢复),从而获得完整的美国英语版本的消息。

在一个单独的线程做这个更好:这确保不会有任何副作用。 例如:

try { System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist"); } catch(Exception ex) { Console.WriteLine(ex.ToString()); //Will display localized message ExceptionLogger el = new ExceptionLogger(ex); System.Threading.Thread t = new System.Threading.Thread(el.DoLog); t.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); t.Start(); } 

ExceptionLogger类看起来像这样:

 class ExceptionLogger { Exception _ex; public ExceptionLogger(Exception ex) { _ex = ex; } public void DoLog() { Console.WriteLine(_ex.ToString()); //Will display en-US message } } 

然而,正如Joe在回复的早期版本中对正确指出的那样,在引发exception时,一些消息已经(部分)从语言资源中加载。

例如,这适用于在引发ArgumentNullException(“foo”)exception时生成的消息的“parameter can not null”部分。 在这些情况下,即使使用上述代码,邮件仍将显示(部分)本地化。

除了通过使用不切实际的黑客,比如在一个线程上使用en-US语言环境运行所有的非UI代码之前,似乎没有太多可以做的事情:.NET Frameworkexception代码没有用于覆盖错误消息语言环境的设施。

您可以在unlocalize.com上search原始exception消息

也许是一个有争议的问题,但是不要把文化设置为en-US ,你可以把它设置为Invariant 。 在Invariant文化中,错误信息是英文的。

 Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; 

它的优点是不会看起来有偏见,特别是对于非美式英语的语言环境。 (也可以避免同事的嘲笑)

Windows需要安装要使用的UI语言。 它不,它没有办法神奇地知道翻译的信息是什么。

在安装了pt-PT的en-US windows 7终极版中,有以下代码:

 Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT"); string msg1 = new DirectoryNotFoundException().Message; Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); string msg2 = new FileNotFoundException().Message; Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR"); string msg3 = new FileNotFoundException().Message; 

以pt-PT,en-US和en-US生成消息。 由于没有安装法国文化文件,它默认为Windows默认(安装?)语言。

这里是不需要任何编码的解决scheme,即使是对于我们可以通过代码(例如mscorlib中的代码)进行更改的exception文本,也是如此。

它可能并不总是适用于所有情况下(这取决于您的设置,因为您需要能够创build一个.config文件撇开主要.exe文件),但这对我很有用。 因此,只需在dev中创build一个app.config (或者在生产中使用[myapp].exe.configweb.config ),其中包含以下行:

 <configuration> ... <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="mscorlib.resources" publicKeyToken="b77a5c561934e089" culture="fr" /> <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Xml.resources" publicKeyToken="b77a5c561934e089" culture="fr" /> <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> ... </configuration> 

这样做是告诉框架redirect汇编绑定为mscorlib的资源和System.Xml的资源,为1至999之间的版本,法国(文化被设置为“fr”)到一个程序集…不存在(一任意版本999)。

所以当CLR会为这两个程序集(mscorlib和System.xml)寻找法语资源时,它将不会find它们并优雅地回退到英语。 根据您的上下文和testing,您可能需要将其他程序集添加到这些redirect(包含本地化资源的程序集)。

当然,我不认为这是由微软支持,所以使用风险自负。 那么,如果你发现一个问题,你可以删除这个configuration,并检查它是不相关的。

我会想象这些方法之一:

1)exception只能由你读取,即它们不是客户端function,所以你可以使用硬连线的非本地化string,在土耳其模式下运行时不会改变。

2)包含一个错误代码,例如。 0X00000001与每个错误,以便您可以轻松地在英文表中查找它。

我知道这是一个古老的话题,但我认为我的解决scheme可能与任何在networkingsearch中遇到的问题都非常相关:

在exceptionlogging器中,您可以loggingex.GetType.ToString,这将保存exception类的名称。 我期望一个类的名字应该独立于语言,因此总是用英语来表示(例如“System.FileNotFoundException”),尽pipe目前我没有访问外语系统来testing理念。

如果你真的想要错误消息的文本,你可以创build一个所有可能的exception类名称和他们相同的消息,你喜欢的任何语言的字典,但对于英语,我认为类名是完全足够的。

.NET框架分为两部分:

  1. .NET框架本身
  2. .NET框架语言包

所有文本(例如,exception消息,MessageBox上的button标签等)在.NET框架本身都是英文的。 语言包具有本地化的文本。

根据您的具体情况,解决scheme是卸载语言包(即告诉客户端这样做)。 在这种情况下,例外文本将是英文的。 但是请注意,所有其他框架提供的文本也都是英文的(例如,MessageBox上的button标签,ApplicationCommands的键盘快捷键)。

设置Thread.CurrentThread.CurrentUICulture将用于本地化exception。 如果你需要两种例外(一种给用户,一种给你),你可以使用下面的函数来转换exception消息。 它在.NET-Libraries资源中search原始文本以获取资源密钥,然后返回已翻译的值。 但是还有一个缺点,我没有find一个好的解决scheme:在资源中包含{0}的消息将不会被find。 如果有人有一个很好的解决scheme,我将不胜感激。

 public static string TranslateExceptionMessage(Exception E, CultureInfo targetCulture) { try { Assembly a = E.GetType().Assembly; ResourceManager rm = new ResourceManager(a.GetName().Name, a); ResourceSet rsOriginal = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true); ResourceSet rsTranslated = rm.GetResourceSet(targetCulture, true, true); foreach (DictionaryEntry item in rsOriginal) if (item.Value.ToString() == E.Message.ToString()) return rsTranslated.GetString(item.Key.ToString(), false); // success } catch { } return E.Message; // failed (error or cause it's not intelligent enough to locale '{0}'-patterns } 
 CultureInfo oldCI = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US"); Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US"); try { System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist"); } catch(Exception ex) { Console.WriteLine(ex.ToString()) } Thread.CurrentThread.CurrentCulture = oldCI; Thread.CurrentThread.CurrentUICulture = oldCI; 

没有WORKAROUNDS。

Tks 🙂

你应该logging调用堆栈,而不是只是错误消息(IIRC,简单的exception.ToString()应该为你做)。 从那里,你可以确定exception来自哪里,通常会推断出是哪个exception。

使用扩展方法覆盖catch块中的exception消息,检查抛出的消息是否来自代码或不如下所述。

  public static string GetEnglishMessageAndStackTrace(this Exception ex) { CultureInfo currentCulture = Thread.CurrentThread.CurrentUICulture; try { dynamic exceptionInstanceLocal = System.Activator.CreateInstance(ex.GetType()); string str; Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US"); if (ex.Message == exceptionInstanceLocal.Message) { dynamic exceptionInstanceENG = System.Activator.CreateInstance(ex.GetType()); str = exceptionInstanceENG.ToString() + ex.StackTrace; } else { str = ex.ToString(); } Thread.CurrentThread.CurrentUICulture = currentCulture; return str; } catch (Exception) { Thread.CurrentThread.CurrentUICulture = currentCulture; return ex.ToString(); } 

我也遇到了同样的情况,我在这里和其他地方find的所有答案都没有帮助或者不令人满意:
用英语强制例外语言
当应用程序使用另一种语言时,用英语获取exception消息?
如何在debugging时将Visual Studioexception消息语言更改为英文
如何处理exception信息的翻译?
如何完全避免本地化的.NETexception消息

Thread.CurrentUICulture更改.netexception的语言,但它不适用于Win32Exception ,它使用Windows UI本身的语言中的Windows资源。 所以我从来没有设法用英文而不是德文打印Win32Exception的消息,甚至没有使用FormatMessage()
如何获得英文Win32Exception?

因此,我创build了我自己的解决scheme,它在外部文件中存储了大部分针对不同语言的现有exception消息。 你不会用你想要的语言得到确切的信息,但是你会用那种语言得到一个信息,这比你现在得到的要多得多(这是一种你可能不懂的语言的信息)。

该类的静态函数可以在具有不同语言的Windows安装中执行: CreateMessages()创build文化特定的文本
SaveMessagesToXML()将它们保存到与创build或加载语言一样多的XML文件中
LoadMessagesFromXML()加载所有XML文件与语言特定的消息

在使用不同语言的不同Windows安装上创buildXML文件时,您将很快拥有所需的所有语言。
也许你可以在安装了多个MUI语言包的情况下在1个Windows上创build不同语言的文本,但是我还没有testing过。

用VS2008testing,随时可以使用。 欢迎提出意见和build议!

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Globalization; using System.Reflection; using System.Threading; using System.Xml; public struct CException { //---------------------------------------------------------------------------- public CException(Exception i_oException) { m_oException = i_oException; m_oCultureInfo = null; m_sMessage = null; } //---------------------------------------------------------------------------- public CException(Exception i_oException, string i_sCulture) { m_oException = i_oException; try { m_oCultureInfo = new CultureInfo(i_sCulture); } catch { m_oCultureInfo = CultureInfo.InvariantCulture; } m_sMessage = null; } //---------------------------------------------------------------------------- public CException(Exception i_oException, CultureInfo i_oCultureInfo) { m_oException = i_oException; m_oCultureInfo = i_oCultureInfo == null ? CultureInfo.InvariantCulture : i_oCultureInfo; m_sMessage = null; } //---------------------------------------------------------------------------- // GetMessage //---------------------------------------------------------------------------- public string GetMessage() { return GetMessage(m_oException, m_oCultureInfo); } public string GetMessage(String i_sCulture) { return GetMessage(m_oException, i_sCulture); } public string GetMessage(CultureInfo i_oCultureInfo) { return GetMessage(m_oException, i_oCultureInfo); } public static string GetMessage(Exception i_oException) { return GetMessage(i_oException, CultureInfo.InvariantCulture); } public static string GetMessage(Exception i_oException, string i_sCulture) { CultureInfo oCultureInfo = null; try { oCultureInfo = new CultureInfo(i_sCulture); } catch { oCultureInfo = CultureInfo.InvariantCulture; } return GetMessage(i_oException, oCultureInfo); } public static string GetMessage(Exception i_oException, CultureInfo i_oCultureInfo) { if (i_oException == null) return null; if (i_oCultureInfo == null) i_oCultureInfo = CultureInfo.InvariantCulture; if (ms_dictCultureExceptionMessages == null) return null; if (!ms_dictCultureExceptionMessages.ContainsKey(i_oCultureInfo)) return CreateMessage(i_oException, i_oCultureInfo); Dictionary<string, string> dictExceptionMessage = ms_dictCultureExceptionMessages[i_oCultureInfo]; string sExceptionName = i_oException.GetType().FullName; sExceptionName = MakeXMLCompliant(sExceptionName); Win32Exception oWin32Exception = (Win32Exception)i_oException; if (oWin32Exception != null) sExceptionName += "_" + oWin32Exception.NativeErrorCode; if (dictExceptionMessage.ContainsKey(sExceptionName)) return dictExceptionMessage[sExceptionName]; else return CreateMessage(i_oException, i_oCultureInfo); } //---------------------------------------------------------------------------- // CreateMessages //---------------------------------------------------------------------------- public static void CreateMessages(CultureInfo i_oCultureInfo) { Thread oTH = new Thread(new ThreadStart(CreateMessagesInThread)); if (i_oCultureInfo != null) { oTH.CurrentCulture = i_oCultureInfo; oTH.CurrentUICulture = i_oCultureInfo; } oTH.Start(); while (oTH.IsAlive) { Thread.Sleep(10); } } //---------------------------------------------------------------------------- // LoadMessagesFromXML //---------------------------------------------------------------------------- public static void LoadMessagesFromXML(string i_sPath, string i_sBaseFilename) { if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename; string[] asFiles = null; try { asFiles = System.IO.Directory.GetFiles(i_sPath, i_sBaseFilename + "_*.xml"); } catch { return; } ms_dictCultureExceptionMessages.Clear(); for (int ixFile = 0; ixFile < asFiles.Length; ixFile++) { string sXmlPathFilename = asFiles[ixFile]; XmlDocument xmldoc = new XmlDocument(); try { xmldoc.Load(sXmlPathFilename); XmlNode xmlnodeRoot = xmldoc.SelectSingleNode("/" + msc_sXmlGroup_Root); string sCulture = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Info + "/" + msc_sXmlData_Culture).Value; CultureInfo oCultureInfo = new CultureInfo(sCulture); XmlNode xmlnodeMessages = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Messages); XmlNodeList xmlnodelistMessage = xmlnodeMessages.ChildNodes; Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(xmlnodelistMessage.Count + 10); for (int ixNode = 0; ixNode < xmlnodelistMessage.Count; ixNode++) dictExceptionMessage.Add(xmlnodelistMessage[ixNode].Name, xmlnodelistMessage[ixNode].InnerText); ms_dictCultureExceptionMessages.Add(oCultureInfo, dictExceptionMessage); } catch { return; } } } //---------------------------------------------------------------------------- // SaveMessagesToXML //---------------------------------------------------------------------------- public static void SaveMessagesToXML(string i_sPath, string i_sBaseFilename) { if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename; foreach (KeyValuePair<CultureInfo, Dictionary<string, string>> kvpCultureExceptionMessages in ms_dictCultureExceptionMessages) { string sXmlPathFilename = i_sPath + i_sBaseFilename + "_" + kvpCultureExceptionMessages.Key.TwoLetterISOLanguageName + ".xml"; Dictionary<string, string> dictExceptionMessage = kvpCultureExceptionMessages.Value; XmlDocument xmldoc = new XmlDocument(); XmlWriter xmlwriter = null; XmlWriterSettings writerSettings = new XmlWriterSettings(); writerSettings.Indent = true; try { XmlNode xmlnodeRoot = xmldoc.CreateElement(msc_sXmlGroup_Root); xmldoc.AppendChild(xmlnodeRoot); XmlNode xmlnodeInfo = xmldoc.CreateElement(msc_sXmlGroup_Info); XmlNode xmlnodeMessages = xmldoc.CreateElement(msc_sXmlGroup_Messages); xmlnodeRoot.AppendChild(xmlnodeInfo); xmlnodeRoot.AppendChild(xmlnodeMessages); XmlNode xmlnodeCulture = xmldoc.CreateElement(msc_sXmlData_Culture); xmlnodeCulture.InnerText = kvpCultureExceptionMessages.Key.Name; xmlnodeInfo.AppendChild(xmlnodeCulture); foreach (KeyValuePair<string, string> kvpExceptionMessage in dictExceptionMessage) { XmlNode xmlnodeMsg = xmldoc.CreateElement(kvpExceptionMessage.Key); xmlnodeMsg.InnerText = kvpExceptionMessage.Value; xmlnodeMessages.AppendChild(xmlnodeMsg); } xmlwriter = XmlWriter.Create(sXmlPathFilename, writerSettings); xmldoc.WriteTo(xmlwriter); } catch (Exception e) { return; } finally { if (xmlwriter != null) xmlwriter.Close(); } } } //---------------------------------------------------------------------------- // CreateMessagesInThread //---------------------------------------------------------------------------- private static void CreateMessagesInThread() { Thread.CurrentThread.Name = "CException.CreateMessagesInThread"; Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(0x1000); GetExceptionMessages(dictExceptionMessage); GetExceptionMessagesWin32(dictExceptionMessage); ms_dictCultureExceptionMessages.Add(Thread.CurrentThread.CurrentUICulture, dictExceptionMessage); } //---------------------------------------------------------------------------- // GetExceptionTypes //---------------------------------------------------------------------------- private static List<Type> GetExceptionTypes() { Assembly[] aoAssembly = AppDomain.CurrentDomain.GetAssemblies(); List<Type> listoExceptionType = new List<Type>(); Type oExceptionType = typeof(Exception); for (int ixAssm = 0; ixAssm < aoAssembly.Length; ixAssm++) { if (!aoAssembly[ixAssm].GlobalAssemblyCache) continue; Type[] aoType = aoAssembly[ixAssm].GetTypes(); for (int ixType = 0; ixType < aoType.Length; ixType++) { if (aoType[ixType].IsSubclassOf(oExceptionType)) listoExceptionType.Add(aoType[ixType]); } } return listoExceptionType; } //---------------------------------------------------------------------------- // GetExceptionMessages //---------------------------------------------------------------------------- private static void GetExceptionMessages(Dictionary<string, string> i_dictExceptionMessage) { List<Type> listoExceptionType = GetExceptionTypes(); for (int ixException = 0; ixException < listoExceptionType.Count; ixException++) { Type oExceptionType = listoExceptionType[ixException]; string sExceptionName = MakeXMLCompliant(oExceptionType.FullName); try { if (i_dictExceptionMessage.ContainsKey(sExceptionName)) continue; Exception e = (Exception)(Activator.CreateInstance(oExceptionType)); i_dictExceptionMessage.Add(sExceptionName, e.Message); } catch (Exception) { i_dictExceptionMessage.Add(sExceptionName, null); } } } //---------------------------------------------------------------------------- // GetExceptionMessagesWin32 //---------------------------------------------------------------------------- private static void GetExceptionMessagesWin32(Dictionary<string, string> i_dictExceptionMessage) { string sTypeName = MakeXMLCompliant(typeof(Win32Exception).FullName) + "_"; for (int iError = 0; iError < 0x4000; iError++) // Win32 errors may range from 0 to 0xFFFF { Exception e = new Win32Exception(iError); if (!e.Message.StartsWith("Unknown error (", StringComparison.OrdinalIgnoreCase)) i_dictExceptionMessage.Add(sTypeName + iError, e.Message); } } //---------------------------------------------------------------------------- // CreateMessage //---------------------------------------------------------------------------- private static string CreateMessage(Exception i_oException, CultureInfo i_oCultureInfo) { CException oEx = new CException(i_oException, i_oCultureInfo); Thread oTH = new Thread(new ParameterizedThreadStart(CreateMessageInThread)); oTH.Start(oEx); while (oTH.IsAlive) { Thread.Sleep(10); } return oEx.m_sMessage; } //---------------------------------------------------------------------------- // CreateMessageInThread //---------------------------------------------------------------------------- private static void CreateMessageInThread(Object i_oData) { if (i_oData == null) return; CException oEx = (CException)i_oData; if (oEx.m_oException == null) return; Thread.CurrentThread.CurrentUICulture = oEx.m_oCultureInfo == null ? CultureInfo.InvariantCulture : oEx.m_oCultureInfo; // create new exception in desired culture Exception e = null; Win32Exception oWin32Exception = (Win32Exception)(oEx.m_oException); if (oWin32Exception != null) e = new Win32Exception(oWin32Exception.NativeErrorCode); else { try { e = (Exception)(Activator.CreateInstance(oEx.m_oException.GetType())); } catch { } } if (e != null) oEx.m_sMessage = e.Message; } //---------------------------------------------------------------------------- // MakeXMLCompliant // from https://www.w3.org/TR/xml/ //---------------------------------------------------------------------------- private static string MakeXMLCompliant(string i_sName) { if (string.IsNullOrEmpty(i_sName)) return "_"; System.Text.StringBuilder oSB = new System.Text.StringBuilder(); for (int ixChar = 0; ixChar < (i_sName == null ? 0 : i_sName.Length); ixChar++) { char character = i_sName[ixChar]; if (IsXmlNodeNameCharacterValid(ixChar, character)) oSB.Append(character); } if (oSB.Length <= 0) oSB.Append("_"); return oSB.ToString(); } //---------------------------------------------------------------------------- private static bool IsXmlNodeNameCharacterValid(int i_ixPos, char i_character) { if (i_character == ':') return true; if (i_character == '_') return true; if (i_character >= 'A' && i_character <= 'Z') return true; if (i_character >= 'a' && i_character <= 'z') return true; if (i_character >= 0x00C0 && i_character <= 0x00D6) return true; if (i_character >= 0x00D8 && i_character <= 0x00F6) return true; if (i_character >= 0x00F8 && i_character <= 0x02FF) return true; if (i_character >= 0x0370 && i_character <= 0x037D) return true; if (i_character >= 0x037F && i_character <= 0x1FFF) return true; if (i_character >= 0x200C && i_character <= 0x200D) return true; if (i_character >= 0x2070 && i_character <= 0x218F) return true; if (i_character >= 0x2C00 && i_character <= 0x2FEF) return true; if (i_character >= 0x3001 && i_character <= 0xD7FF) return true; if (i_character >= 0xF900 && i_character <= 0xFDCF) return true; if (i_character >= 0xFDF0 && i_character <= 0xFFFD) return true; // if (i_character >= 0x10000 && i_character <= 0xEFFFF) return true; if (i_ixPos > 0) { if (i_character == '-') return true; if (i_character == '.') return true; if (i_character >= '0' && i_character <= '9') return true; if (i_character == 0xB7) return true; if (i_character >= 0x0300 && i_character <= 0x036F) return true; if (i_character >= 0x203F && i_character <= 0x2040) return true; } return false; } private static string msc_sBaseFilename = "exception_messages"; private static string msc_sXmlGroup_Root = "exception_messages"; private static string msc_sXmlGroup_Info = "info"; private static string msc_sXmlGroup_Messages = "messages"; private static string msc_sXmlData_Culture = "culture"; private Exception m_oException; private CultureInfo m_oCultureInfo; private string m_sMessage; static Dictionary<CultureInfo, Dictionary<string, string>> ms_dictCultureExceptionMessages = new Dictionary<CultureInfo, Dictionary<string, string>>(); } internal class Program { public static void Main() { CException.CreateMessages(null); CException.SaveMessagesToXML(@"d:\temp\", "emsg"); CException.LoadMessagesFromXML(@"d:\temp\", "emsg"); } } 

对于日志logging来说,某些应用程序可能需要获取英文exception消息(除了在通常的客户端UICulture中显示)之外。

为此,下面的代码

  1. 改变目前的UICulture
  2. 使用“GetType()”和“Activator.CreateInstance(t)”重新创build抛出的Exception对象
  3. 在新的UICuture中显示新的exception对象的消息
  4. 最后把目前的UICulture改回早期的UICulture。

      try { int[] a = { 3, 6 }; Console.WriteLine(a[3]); //Throws index out of bounds exception System.IO.StreamReader sr = new System.IO.StreamReader(@"c:\does-not-exist"); // throws file not found exception throw new System.IO.IOException(); } catch (Exception ex) { Console.WriteLine(ex.Message); Type t = ex.GetType(); CultureInfo CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture; System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US"); object o = Activator.CreateInstance(t); System.Threading.Thread.CurrentThread.CurrentUICulture = CurrentUICulture; // Changing the UICulture back to earlier culture Console.WriteLine(((Exception)o).Message.ToString()); Console.ReadLine(); }