我们通过将 Exception.Message 写入文件来记录系统中发生的任何异常。然而,它们是根据客户的文化编写的。土耳其的错误对我来说意义不大。
那么我们如何才能在不改变用户文化的情况下用英语记录错误消息呢?
这个问题可以部分解决。框架异常代码根据当前线程区域设置从其资源加载错误消息。在某些异常情况下,这种情况会在访问 Message 属性时发生。
对于这些例外情况,您可以通过在记录时将线程区域设置短暂切换为 en-US(预先保存原始用户区域设置并在之后立即恢复)来获取消息的完整美国英语版本。
在单独的线程上执行此操作甚至更好:这可以确保不会有任何副作用。例如:
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 https://stackoverflow.com/users/13087/joe在对此答复的早期修订版的评论中正确指出,在引发异常时已经(部分)从语言资源加载了一些消息。
例如,这适用于抛出 ArgumentNullException("foo") 异常时生成的消息的“参数不能为空”部分。在这些情况下,即使使用上述代码,消息仍将显示(部分)本地化。
除了使用不切实际的技巧(例如在使用 en-US 语言环境的线程上运行所有非 UI 代码)之外,您似乎对此无能为力:.NET Framework 异常代码没有用于覆盖错误消息区域设置的工具。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)