4

我在 main 中使用了 try ... catch 块。

当我设置以下

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

这会处理所有异常并用英文打印它们

但这对于内部的许多 API 来说都失败了,尤其是对于像目录访问那样捕获的异常。还有什么需要做的吗?

所以主要问题是这个 Execption

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

之后的消息未出现在语言环境集中

4

3 回答 3

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 设置为英语!

于 2012-10-08T06:36:43.410 回答
0

这个问题可以部分解决。框架异常代码根据当前线程语言环境从其资源中加载错误消息。在某些例外情况下,这发生在访问 Message 属性时。

对于这些例外情况,您可以通过在记录消息时将线程区域设置短暂切换为 en-US 来获取消息的完整美国英语版本(事先保存原始用户区域设置并在之后立即恢复)。

在单独的线程上执行此操作会更好:这可以确保不会有任何副作用。

参考:英文的异常信息?

于 2012-10-04T09:20:46.630 回答
0

不要为用户选择文化。让他自己做。
在极少数情况下,您必须使用预定义的文化,但在大多数情况下,这是用户的业务 - 使用什么文化。

于 2012-10-04T09:27:38.470 回答