2012-10-04 50 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

我无法更强烈地反对。这不是为用户选择文化的情况,因为例外文本对用户不利。许多程序会捕获所有异常,并弹出一个错误报告对话框,让您将报告发送给开发人员。我该怎么处理一个怪异的俄罗斯或韩国的异常信息?它们是没用的,用户不需要看到它们。 –