[解決済み】例外メッセージは英語で?
質問
システムで発生した例外は、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の例外コードには、エラー メッセージのロケールを上書きする機能がないのです。
関連
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】Unity3DでOnTriggerEnterが動作しない件
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] Pythonで例外を表示するには?
-
[解決済み] Pythonの関数が例外を投げるかどうかをテストするにはどうすればよいですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み】文字列が有効な DateTime " format dd/MM/yyyy " として認識されなかった。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】「namespace x already contains a definition for x」エラーの修正方法は?VS2010にコンバートした後に発生しました。
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】5.7.57 SMTP - MAIL FROMエラー時に匿名メールを送信するためにクライアントが認証されない
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?