1. ホーム
  2. c#

[解決済み】例外メッセージは英語で?

2022-03-26 12:10:01

質問

システムで発生した例外は、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
  }
}

しかし ジョー この返信の以前のリビジョンに対するコメントで正しく指摘されているように、例外が投げられた時点で、いくつかのメッセージはすでに言語リソースから(部分的に)読み込まれています。

例えばArgumentNullException("foo")例外が発生したときに生成されるメッセージの「パラメータはNULLではありえない」という部分がこれに該当します。そのような場合、上記のコードを使用しても、メッセージは(部分的に)ローカライズされて表示されます。

非UIコードをすべてen-USロケールのスレッドで実行するなどの非現実的なハックを使用する以外に、それについてできることはあまりないようです。.NET Frameworkの例外コードには、エラー メッセージのロケールを上書きする機能がないのです。