338 votes

C# - Exception des messages en anglais?

Nous sommes la journalisation de toutes les exceptions qui se produisent dans notre système par l'écriture de l'Exception.Message dans un fichier. Toutefois, ils sont écrits dans la culture du client. Turque et les erreurs à ne pas dire beaucoup pour moi.

Alors, comment pouvons-nous le journal des messages d'erreur tout en anglais sans changer les utilisateurs de la culture?

78voto

mdb Points 20629

Ce problème peut être partiellement contourné. Le Cadre de l'exception de code charge les messages d'erreur à partir de ses ressources, basé sur le thread en cours de paramètres régionaux. Dans le cas de certaines exceptions, cela arrive au moment où le Message de la propriété est accessible.

Pour ces exceptions, vous pouvez obtenir la version anglaise du message par brièvement la commutation de la thread de la locale fr-fr pendant l'enregistrement (enregistrement de l'utilisateur d'origine locale à l'avance et de les restaurer immédiatement par la suite).

Faire cela sur un thread séparé, c'est encore mieux: cela vous assure il n'y aura aucun effets secondaires. Par exemple:

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();
}

Où la ExceptionLogger de classe ressemble à quelque chose comme:

class ExceptionLogger
{
  Exception _ex;

  public ExceptionLogger(Exception ex)
  {
    _ex = ex;
  }

  public void DoLog()
  {
    Console.WriteLine(_ex.ToString()); //Will display en-US message
  }
}

Cependant, comme Joe correctement le souligne dans un commentaire sur une version antérieure de cette réponse, certains messages sont déjà (partiellement) chargé à partir de la langue de ressources au moment de l'exception est levée.

Cela s'applique à la "paramètre ne peut pas être null' une partie du message est émis quand un ArgumentNullException("foo") exception est levée, par exemple. Dans ces cas, le message apparaît toujours (partiellement), localisées, même lorsque vous utilisez le code ci-dessus.

Autres que par l'utilisation peu pratique hacks, telles que l'exécution de tous vos non-code de l'INTERFACE utilisateur sur un thread avec régionaux en-US pour commencer, il ne semble pas être beaucoup que vous pouvez faire à ce sujet: le .NET Framework code d'exception n'a pas d'installations pour annuler le message d'erreur locale.

71voto

user461128 Points 308

Vous pouvez rechercher l'origine du message d'exception à unlocalize.com

47voto

MPelletier Points 8326

D'un point litigieux peut-être, mais au lieu de définir la culture, en fr-US, qui vous permet de l'Invariant. Dans l'Invariant de la culture, les messages d'erreur sont en anglais.

Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

Il a l'avantage de ne pas à la recherche biaisée, en particulier pour les non-Américains anglophones locales. (un.k.un. évite les remarques sarcastiques de la part des collègues)

7voto

P a u l Points 2877

Le long de ces lignes, je ne suis toujours pas à l'aise avec la conception d'erreurs .net. C'est des classes d'exception et des événements, avec des descriptions de texte. Vous découvrez de l'erreur en fonction de la classe d'exception levée, et le texte de description de l'erreur. Il n'existe généralement pas numérique des codes d'erreur (sauf s'ils sont enterrés à l'intérieur d'un système interne d'exception) que vous pouvez consulter dans un sens bien défini la liste des erreurs. Pourquoi ne serait ce pas plus simple?

1voto

morechilli Points 4889

J'imagine que l'un de ces approches:

1) Les exceptions ne sont jamais lus par vous, c'est à dire qu'ils ne sont pas une fonctionnalité de client, de sorte que vous pouvez utiliser câblé non localisées chaînes qui ne change pas lorsque vous exécutez en turc mode.

2) Comprennent un code d'erreur par exemple. 0X00000001 avec chaque erreur, de sorte que vous pouvez facilement regarder en haut dans un anglais de table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X