Messages d'Exception en anglais?

nous enregistrons toutes les exceptions qui se produisent dans notre système en écrivant L'Exception.Message à un fichier. Toutefois, ils sont écrits dans la culture du client. Et les erreurs Turques ne signifient pas grand chose pour moi.

alors comment pouvons-nous enregistrer des messages d'erreur en anglais sans changer la culture des utilisateurs?

259
demandé sur BartoszKP 2008-10-16 19:47:12

14 réponses

ce numéro peut être partiellement contourné. Le code D'exception Framework charge les messages d'erreur à partir de ses ressources, sur la base de la locale de thread courante. Dans le cas de certaines exceptions, cela se produit au moment où l'on accède à la propriété Message.

pour ces exceptions, vous pouvez obtenir la version anglaise complète du message en changeant brièvement la locale du thread à en-US pendant la journalisation (enregistrer la locale de l'utilisateur d'origine à l'avance et la restaurer immédiatement après).

faire cela sur un fil séparé est encore mieux: cela garantit qu'il n'y aura pas d'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 classe ExceptionLogger 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, Joe souligne à juste titre dans un commentaire sur une version antérieure de cette réponse, certains messages sont déjà (partiellement) chargé de les ressources de la langue à l'époque l'exception est levée.

ceci s'applique à la partie 'paramètre ne peut pas être null' du message généré lorsqu'une exception ArgumentNullException ("foo") est lancée, par exemple. Dans ces cas, le message apparaîtra encore (partiellement) localisé, même en utilisant le code ci-dessus.

sauf en utilisant des hacks impraticables, comme lancer tout votre code non-UI sur un thread avec en-US locale pour commencer, il ne semble pas y avoir beaucoup de choses que vous pouvez faire que: le code D'exception .net Framework N'a pas de facilités pour passer outre le message d'erreur locale.

60
répondu mdb 2017-05-23 11:33:26

vous pouvez rechercher le message d'exception original à unlocalize.com

60
répondu user461128 2010-09-28 22:00:31

un point controversé peut-être, mais au lieu de mettre la culture à en-US , vous pouvez mettre à Invariant . Dans la culture Invariant , les messages d'erreur sont en anglais.

Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;

il a l'avantage de ne pas avoir l'air biaisé, surtout pour les endroits non-américains anglophones. (A. K. A. évite les remarques sournoises de collègues)

32
répondu MPelletier 2015-09-08 19:05:29

Windows doit avoir le langage UI que vous voulez utiliser installé. Si ce n'est pas le cas, il n'y a aucun moyen de savoir par magie ce qu'est le message traduit.

dans un en-US windows 7 ultimate, avec pt-PT installé, le code suivant:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("pt-PT");
string msg1 = new DirectoryNotFoundException().Message;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
string msg2 = new FileNotFoundException().Message;

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
string msg3 = new FileNotFoundException().Message;

produit des messages en pt-PT, en-US et en-US. Comme il n'y a pas de fichiers culture français installés, il est par défaut dans windows (installé?) langue.

7
répondu danobrega 2012-05-12 18:11:06

Voici une solution qui ne nécessite pas de codage et fonctionne même pour les textes d'exceptions qui sont chargés trop tôt pour nous permettre de changer par code (par exemple, ceux de mscorlib).

il peut ne pas être toujours applicable dans tous les cas (cela dépend de votre configuration car vous avez besoin d'être en mesure de créer un .fichier de configuration de côté le principal .exe file) mais ça marche pour moi. Donc, il suffit de créer un app.config dans dev, (ou un [myapp].exe.config ou web.config en production) qui contient les lignes suivantes par exemple:

<configuration>
  ...
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="mscorlib.resources" publicKeyToken="b77a5c561934e089" culture="fr" />
        <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="System.Xml.resources" publicKeyToken="b77a5c561934e089" culture="fr" />
        <bindingRedirect oldVersion="1.0.0.0-999.0.0.0" newVersion="999.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
  ...
</configuration>

ce que cela fait est de dire au cadre de rediriger les fixations d'assemblage pour les ressources et le système de mscorlib.Ressources Xml, pour les versions entre 1 et 999, en français (la culture est définie à "fr") à une assemblée qui ... n'existe pas (une version arbitraire 999).

donc quand le CLR va chercher des ressources françaises pour ces deux assemblées (mscorlib et System.xml), il ne les trouvera pas et repli vers l'anglais avec élégance. Selon votre contexte et vos testages, vous pourriez vouloir ajouter d'autres assemblages à ces redirections (assemblages qui contiennent des ressources localisées).

bien sûr, Je ne pense pas que cela soit pris en charge par Microsoft, donc utilisez à vos propres risques. Bien, au cas où vous détecteriez un problème, vous pouvez simplement supprimer cette configuration et vérifier qu'elle n'a aucun rapport.

6
répondu Simon Mourier 2017-11-01 08:20:08

je sais que c'est un vieux sujet, mais je pense que ma solution peut être tout à fait pertinente pour quiconque trébuche à travers elle dans une recherche sur le web:

dans l'enregistreur d'exception, vous pouvez enregistrer ex.GetType.ToString, qui sauvegarderait le nom de la classe exception. Je m'attendrais à ce que le nom d'une classe soit indépendant de la langue et qu'il soit donc toujours représenté en anglais (par exemple "System").FileNotFoundException"), bien qu'à l'heure actuelle je n'ai pas accès à un système de la langue pour tester l'idée.

si vous voulez vraiment le texte du message d'erreur aussi bien vous pouvez créer un dictionnaire de tous les noms de classe d'exception possibles et leurs messages équivalents dans n'importe quelle langue que vous préférez, mais pour l'anglais je pense que le nom de classe est parfaitement adéquat.

4
répondu Barbarian 2011-08-26 15:17:02

Réglage Thread.CurrentThread.CurrentUICulture sera utilisé pour localiser les exceptions. Si vous avez besoin de deux types d'exceptions (l'une pour l'utilisateur, pour vous), vous pouvez utiliser la fonction suivante pour traduire l'exception de message. Il cherche dans les ressources .NET-Libraries le texte original pour obtenir la ressource-clé et ensuite renvoie la valeur traduite. Mais il y a une faiblesse que je n'ai pas encore trouvé de bonne solution: les Messages, qui contiennent {0} en ressources ne seront pas trouvés. Si quelqu'un a une bonne solution je serait reconnaissant.

public static string TranslateExceptionMessage(Exception E, CultureInfo targetCulture)
{
    try
    {
        Assembly a = E.GetType().Assembly;
        ResourceManager rm = new ResourceManager(a.GetName().Name, a);
        ResourceSet rsOriginal = rm.GetResourceSet(Thread.CurrentThread.CurrentUICulture, true, true);
        ResourceSet rsTranslated = rm.GetResourceSet(targetCulture, true, true);
        foreach (DictionaryEntry item in rsOriginal)
            if (item.Value.ToString() == E.Message.ToString())
                return rsTranslated.GetString(item.Key.ToString(), false); // success

    }
    catch { }
    return E.Message; // failed (error or cause it's not intelligent enough to locale '{0}'-patterns
}
3
répondu Undercover1989 2018-03-23 08:18:21

j'imagine l'une de ces approches:

1) les exceptions ne sont jamais lues que par vous, c'est-à-dire qu'elles ne sont pas une fonctionnalité client, de sorte que vous pouvez utiliser des chaînes non localisées câblées qui ne changeront pas lorsque vous utilisez le mode Turc.

2) inclure un code d'erreur eg. 0X00000001 avec chaque erreur de sorte que vous pouvez facilement le chercher dans une table anglaise.

2
répondu morechilli 2008-10-16 16:04:11
CultureInfo oldCI = Thread.CurrentThread.CurrentCulture;

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture ("en-US");
Thread.CurrentThread.CurrentUICulture=new CultureInfo("en-US");
try
{
  System.IO.StreamReader sr=new System.IO.StreamReader(@"c:\does-not-exist");
}
catch(Exception ex)
{
  Console.WriteLine(ex.ToString())
}
Thread.CurrentThread.CurrentCulture = oldCI;
Thread.CurrentThread.CurrentUICulture = oldCI;

sans solutions de rechange.

Tks:)

2
répondu 2009-01-15 21:36:03

.NET framework est fourni en deux parties:

  1. .NET framework lui-même
  2. the .NET framework language packs

tous les textes (ex. messages d'exception, étiquettes de boutons sur une boîte à messages, etc.) sont en anglais dans le cadre du .NET lui-même. Les paquets de langue ont les textes localisés.

selon votre situation exacte, une solution serait de désinstaller les paquets de langue (c'est à dire indiquer au client de le faire). Dans ce cas, les textes d'exception seront en anglais. Il convient toutefois de noter que tout autre texte fourni dans le cadre sera aussi en anglais (p. ex. les étiquettes de bouton sur un MessageBox, raccourcis clavier pour ApplicationCommands).

2
répondu Daniel Rose 2014-04-28 12:34:30

j'ai eu la même situation, et toutes les réponses que j'ai trouvées ici et ailleurs n'ont pas aidé ou n'étaient pas satisfaisantes:

force exceptions langue en anglais

C# - recevoir des messages D'Exception en anglais lorsque l'application est dans une autre langue?

Comment changer la langue des messages d'exception de Visual Studio en anglais pendant le débogage

comment gérer la traduction d'un message d'exception?

Comment éviter complètement les messages d'exception localisés .NET

le Thread.CurrentUICulture change la langue des exceptions .net, mais pas pour Win32Exception , qui utilise des ressources Windows dans la langue de L'interface de Windows elle-même. Donc je n'ai jamais réussi à imprimer les messages de Win32Exception en anglais au lieu de Allemand, pas même en utilisant FormatMessage() comme décrit dans

Comment obtenir Win32Exception en anglais?

J'ai donc créé ma propre solution, qui stocke la majorité des messages d'exception existants pour différentes langues dans des fichiers externes. Vous ne serez pas obtenir le message exact dans la langue de votre choix, mais vous obtiendrez un message dans cette langue, ce qui est beaucoup plus que ce que vous recevez (qui est un message dans un langue que vous ne comprenez probablement pas).

les fonctions statiques de cette classe peuvent être exécutées sur des installations Windows avec différentes langues: CreateMessages() crée les textes spécifiques à la culture

SaveMessagesToXML() les sauve à autant de fichiers XML que les langues sont créées ou chargées

LoadMessagesFromXML() charge tous les fichiers XML avec des messages spécifiques à la langue

lors de la création des fichiers XML sur différentes fenêtres installations avec différentes langues, vous aurez bientôt toutes les langues dont vous avez besoin.

Peut-être que vous pouvez créer les textes pour différentes langues sur 1 Windows quand vous avez plusieurs paquets de langue MUI installés, mais je n'ai pas encore testé cela.

Testé avec VS2008, prêt à l'emploi. Commentaires et suggestions sont les bienvenues!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Globalization;
using System.Reflection;
using System.Threading;
using System.Xml;

public struct CException
{
  //----------------------------------------------------------------------------
  public CException(Exception i_oException)
  {
    m_oException = i_oException;
    m_oCultureInfo = null;
    m_sMessage = null;
  }

  //----------------------------------------------------------------------------
  public CException(Exception i_oException, string i_sCulture)
  {
    m_oException = i_oException;
    try
    { m_oCultureInfo = new CultureInfo(i_sCulture); }
    catch
    { m_oCultureInfo = CultureInfo.InvariantCulture; }
    m_sMessage = null;
  }

  //----------------------------------------------------------------------------
  public CException(Exception i_oException, CultureInfo i_oCultureInfo)
  {
    m_oException = i_oException;
    m_oCultureInfo = i_oCultureInfo == null ? CultureInfo.InvariantCulture : i_oCultureInfo;
    m_sMessage = null;
  }

  //----------------------------------------------------------------------------
  // GetMessage
  //----------------------------------------------------------------------------
  public string GetMessage() { return GetMessage(m_oException, m_oCultureInfo); }

  public string GetMessage(String i_sCulture) { return GetMessage(m_oException, i_sCulture); }

  public string GetMessage(CultureInfo i_oCultureInfo) { return GetMessage(m_oException, i_oCultureInfo); }

  public static string GetMessage(Exception i_oException) { return GetMessage(i_oException, CultureInfo.InvariantCulture); }

  public static string GetMessage(Exception i_oException, string i_sCulture)
  {
    CultureInfo oCultureInfo = null;
    try
    { oCultureInfo = new CultureInfo(i_sCulture); }
    catch
    { oCultureInfo = CultureInfo.InvariantCulture; }
    return GetMessage(i_oException, oCultureInfo);
  }

  public static string GetMessage(Exception i_oException, CultureInfo i_oCultureInfo)
  {
    if (i_oException == null) return null;
    if (i_oCultureInfo == null) i_oCultureInfo = CultureInfo.InvariantCulture;

    if (ms_dictCultureExceptionMessages == null) return null;
    if (!ms_dictCultureExceptionMessages.ContainsKey(i_oCultureInfo))
      return CreateMessage(i_oException, i_oCultureInfo);

    Dictionary<string, string> dictExceptionMessage = ms_dictCultureExceptionMessages[i_oCultureInfo];
    string sExceptionName = i_oException.GetType().FullName;
    sExceptionName = MakeXMLCompliant(sExceptionName);
    Win32Exception oWin32Exception = (Win32Exception)i_oException;
    if (oWin32Exception != null)
      sExceptionName += "_" + oWin32Exception.NativeErrorCode;
    if (dictExceptionMessage.ContainsKey(sExceptionName))
      return dictExceptionMessage[sExceptionName];
    else
      return CreateMessage(i_oException, i_oCultureInfo);
  }

  //----------------------------------------------------------------------------
  // CreateMessages
  //----------------------------------------------------------------------------
  public static void CreateMessages(CultureInfo i_oCultureInfo)
  {
    Thread oTH = new Thread(new ThreadStart(CreateMessagesInThread));
    if (i_oCultureInfo != null)
    {
      oTH.CurrentCulture = i_oCultureInfo;
      oTH.CurrentUICulture = i_oCultureInfo;
    }
    oTH.Start();
    while (oTH.IsAlive)
    { Thread.Sleep(10); }
  }

  //----------------------------------------------------------------------------
  // LoadMessagesFromXML
  //----------------------------------------------------------------------------
  public static void LoadMessagesFromXML(string i_sPath, string i_sBaseFilename)
  {
    if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename;

    string[] asFiles = null;
    try
    {
      asFiles = System.IO.Directory.GetFiles(i_sPath, i_sBaseFilename + "_*.xml");
    }
    catch { return; }

    ms_dictCultureExceptionMessages.Clear();
    for (int ixFile = 0; ixFile < asFiles.Length; ixFile++)
    {
      string sXmlPathFilename = asFiles[ixFile];

      XmlDocument xmldoc = new XmlDocument();
      try
      {
        xmldoc.Load(sXmlPathFilename);
        XmlNode xmlnodeRoot = xmldoc.SelectSingleNode("/" + msc_sXmlGroup_Root);

        string sCulture = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Info + "/" + msc_sXmlData_Culture).Value;
        CultureInfo oCultureInfo = new CultureInfo(sCulture);

        XmlNode xmlnodeMessages = xmlnodeRoot.SelectSingleNode(msc_sXmlGroup_Messages);
        XmlNodeList xmlnodelistMessage = xmlnodeMessages.ChildNodes;
        Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(xmlnodelistMessage.Count + 10);
        for (int ixNode = 0; ixNode < xmlnodelistMessage.Count; ixNode++)
          dictExceptionMessage.Add(xmlnodelistMessage[ixNode].Name, xmlnodelistMessage[ixNode].InnerText);
        ms_dictCultureExceptionMessages.Add(oCultureInfo, dictExceptionMessage);
      }
      catch
      { return; }
    }
  }

  //----------------------------------------------------------------------------
  // SaveMessagesToXML
  //----------------------------------------------------------------------------
  public static void SaveMessagesToXML(string i_sPath, string i_sBaseFilename)
  {
    if (i_sBaseFilename == null) i_sBaseFilename = msc_sBaseFilename;

    foreach (KeyValuePair<CultureInfo, Dictionary<string, string>> kvpCultureExceptionMessages in ms_dictCultureExceptionMessages)
    {
      string sXmlPathFilename = i_sPath + i_sBaseFilename + "_" + kvpCultureExceptionMessages.Key.TwoLetterISOLanguageName + ".xml";
      Dictionary<string, string> dictExceptionMessage = kvpCultureExceptionMessages.Value;

      XmlDocument xmldoc = new XmlDocument();
      XmlWriter xmlwriter = null;
      XmlWriterSettings writerSettings = new XmlWriterSettings();
      writerSettings.Indent = true;

      try
      {
        XmlNode xmlnodeRoot = xmldoc.CreateElement(msc_sXmlGroup_Root);
        xmldoc.AppendChild(xmlnodeRoot);
        XmlNode xmlnodeInfo = xmldoc.CreateElement(msc_sXmlGroup_Info);
        XmlNode xmlnodeMessages = xmldoc.CreateElement(msc_sXmlGroup_Messages);
        xmlnodeRoot.AppendChild(xmlnodeInfo);
        xmlnodeRoot.AppendChild(xmlnodeMessages);

        XmlNode xmlnodeCulture = xmldoc.CreateElement(msc_sXmlData_Culture);
        xmlnodeCulture.InnerText = kvpCultureExceptionMessages.Key.Name;
        xmlnodeInfo.AppendChild(xmlnodeCulture);

        foreach (KeyValuePair<string, string> kvpExceptionMessage in dictExceptionMessage)
        {
          XmlNode xmlnodeMsg = xmldoc.CreateElement(kvpExceptionMessage.Key);
          xmlnodeMsg.InnerText = kvpExceptionMessage.Value;
          xmlnodeMessages.AppendChild(xmlnodeMsg);
        }

        xmlwriter = XmlWriter.Create(sXmlPathFilename, writerSettings);
        xmldoc.WriteTo(xmlwriter);
      }
      catch (Exception e)
      { return; }
      finally
      { if (xmlwriter != null) xmlwriter.Close(); }
    }
  }

  //----------------------------------------------------------------------------
  // CreateMessagesInThread
  //----------------------------------------------------------------------------
  private static void CreateMessagesInThread()
  {
    Thread.CurrentThread.Name = "CException.CreateMessagesInThread";

    Dictionary<string, string> dictExceptionMessage = new Dictionary<string, string>(0x1000);

    GetExceptionMessages(dictExceptionMessage);
    GetExceptionMessagesWin32(dictExceptionMessage);

    ms_dictCultureExceptionMessages.Add(Thread.CurrentThread.CurrentUICulture, dictExceptionMessage);
  }

  //----------------------------------------------------------------------------
  // GetExceptionTypes
  //----------------------------------------------------------------------------
  private static List<Type> GetExceptionTypes()
  {
    Assembly[] aoAssembly = AppDomain.CurrentDomain.GetAssemblies();

    List<Type> listoExceptionType = new List<Type>();

    Type oExceptionType = typeof(Exception);
    for (int ixAssm = 0; ixAssm < aoAssembly.Length; ixAssm++)
    {
      if (!aoAssembly[ixAssm].GlobalAssemblyCache) continue;
      Type[] aoType = aoAssembly[ixAssm].GetTypes();
      for (int ixType = 0; ixType < aoType.Length; ixType++)
      {
        if (aoType[ixType].IsSubclassOf(oExceptionType))
          listoExceptionType.Add(aoType[ixType]);
      }
    }

    return listoExceptionType;
  }

  //----------------------------------------------------------------------------
  // GetExceptionMessages
  //----------------------------------------------------------------------------
  private static void GetExceptionMessages(Dictionary<string, string> i_dictExceptionMessage)
  {
    List<Type> listoExceptionType = GetExceptionTypes();
    for (int ixException = 0; ixException < listoExceptionType.Count; ixException++)
    {
      Type oExceptionType = listoExceptionType[ixException];
      string sExceptionName = MakeXMLCompliant(oExceptionType.FullName);
      try
      {
        if (i_dictExceptionMessage.ContainsKey(sExceptionName))
          continue;
        Exception e = (Exception)(Activator.CreateInstance(oExceptionType));
        i_dictExceptionMessage.Add(sExceptionName, e.Message);
      }
      catch (Exception)
      { i_dictExceptionMessage.Add(sExceptionName, null); }
    }
  }

  //----------------------------------------------------------------------------
  // GetExceptionMessagesWin32
  //----------------------------------------------------------------------------
  private static void GetExceptionMessagesWin32(Dictionary<string, string> i_dictExceptionMessage)
  {
    string sTypeName = MakeXMLCompliant(typeof(Win32Exception).FullName) + "_";
    for (int iError = 0; iError < 0x4000; iError++)  // Win32 errors may range from 0 to 0xFFFF
    {
      Exception e = new Win32Exception(iError);
      if (!e.Message.StartsWith("Unknown error (", StringComparison.OrdinalIgnoreCase))
        i_dictExceptionMessage.Add(sTypeName + iError, e.Message);
    }
  }

  //----------------------------------------------------------------------------
  // CreateMessage
  //----------------------------------------------------------------------------
  private static string CreateMessage(Exception i_oException, CultureInfo i_oCultureInfo)
  {
    CException oEx = new CException(i_oException, i_oCultureInfo);
    Thread oTH = new Thread(new ParameterizedThreadStart(CreateMessageInThread));
    oTH.Start(oEx);
    while (oTH.IsAlive)
    { Thread.Sleep(10); }
    return oEx.m_sMessage;
  }

  //----------------------------------------------------------------------------
  // CreateMessageInThread
  //----------------------------------------------------------------------------
  private static void CreateMessageInThread(Object i_oData)
  {
    if (i_oData == null) return;
    CException oEx = (CException)i_oData;
    if (oEx.m_oException == null) return;

    Thread.CurrentThread.CurrentUICulture = oEx.m_oCultureInfo == null ? CultureInfo.InvariantCulture : oEx.m_oCultureInfo;
    // create new exception in desired culture
    Exception e = null;
    Win32Exception oWin32Exception = (Win32Exception)(oEx.m_oException);
    if (oWin32Exception != null)
      e = new Win32Exception(oWin32Exception.NativeErrorCode);
    else
    {
      try
      {
        e = (Exception)(Activator.CreateInstance(oEx.m_oException.GetType()));
      }
      catch { }
    }
    if (e != null)
      oEx.m_sMessage = e.Message;
  }

  //----------------------------------------------------------------------------
  // MakeXMLCompliant
  // from https://www.w3.org/TR/xml/
  //----------------------------------------------------------------------------
  private static string MakeXMLCompliant(string i_sName)
  {
    if (string.IsNullOrEmpty(i_sName))
      return "_";

    System.Text.StringBuilder oSB = new System.Text.StringBuilder();
    for (int ixChar = 0; ixChar < (i_sName == null ? 0 : i_sName.Length); ixChar++)
    {
      char character = i_sName[ixChar];
      if (IsXmlNodeNameCharacterValid(ixChar, character))
        oSB.Append(character);
    }
    if (oSB.Length <= 0)
      oSB.Append("_");
    return oSB.ToString();
  }

  //----------------------------------------------------------------------------
  private static bool IsXmlNodeNameCharacterValid(int i_ixPos, char i_character)
  {
    if (i_character == ':') return true;
    if (i_character == '_') return true;
    if (i_character >= 'A' && i_character <= 'Z') return true;
    if (i_character >= 'a' && i_character <= 'z') return true;
    if (i_character >= 0x00C0 && i_character <= 0x00D6) return true;
    if (i_character >= 0x00D8 && i_character <= 0x00F6) return true;
    if (i_character >= 0x00F8 && i_character <= 0x02FF) return true;
    if (i_character >= 0x0370 && i_character <= 0x037D) return true;
    if (i_character >= 0x037F && i_character <= 0x1FFF) return true;
    if (i_character >= 0x200C && i_character <= 0x200D) return true;
    if (i_character >= 0x2070 && i_character <= 0x218F) return true;
    if (i_character >= 0x2C00 && i_character <= 0x2FEF) return true;
    if (i_character >= 0x3001 && i_character <= 0xD7FF) return true;
    if (i_character >= 0xF900 && i_character <= 0xFDCF) return true;
    if (i_character >= 0xFDF0 && i_character <= 0xFFFD) return true;
    // if (i_character >= 0x10000 && i_character <= 0xEFFFF) return true;

    if (i_ixPos > 0)
    {
      if (i_character == '-') return true;
      if (i_character == '.') return true;
      if (i_character >= '0' && i_character <= '9') return true;
      if (i_character == 0xB7) return true;
      if (i_character >= 0x0300 && i_character <= 0x036F) return true;
      if (i_character >= 0x203F && i_character <= 0x2040) return true;
    }
    return false;
  }

  private static string msc_sBaseFilename = "exception_messages";
  private static string msc_sXmlGroup_Root = "exception_messages";
  private static string msc_sXmlGroup_Info = "info";
  private static string msc_sXmlGroup_Messages = "messages";
  private static string msc_sXmlData_Culture = "culture";

  private Exception m_oException;
  private CultureInfo m_oCultureInfo;
  private string m_sMessage;

  static Dictionary<CultureInfo, Dictionary<string, string>> ms_dictCultureExceptionMessages = new Dictionary<CultureInfo, Dictionary<string, string>>();
}

internal class Program
{
  public static void Main()
  {
    CException.CreateMessages(null);
    CException.SaveMessagesToXML(@"d:\temp\", "emsg");
    CException.LoadMessagesFromXML(@"d:\temp\", "emsg");
  }
}
0
répondu Tobias Knauss 2017-05-23 12:34:59

vous devez enregistrer la pile d'appels au lieu d'un simple message d'erreur (IIRC, simple exception.ToString() devrait le faire pour vous). De là, vous pouvez déterminer exactement d'où l'exception provient, et habituellement déduire quelle exception il est.

-1
répondu Branko Dimitrijevic 2010-05-27 18:49:53

Outrepasser le message d'exception dans le bloc de saisie en utilisant la méthode d'extension, vérifier que le message jeté est du code ou non tel que mentionné ci-dessous.

    public static string GetEnglishMessageAndStackTrace(this Exception ex)
    {
        CultureInfo currentCulture = Thread.CurrentThread.CurrentUICulture;
        try
        {

            dynamic exceptionInstanceLocal = System.Activator.CreateInstance(ex.GetType());
            string str;
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");

            if (ex.Message == exceptionInstanceLocal.Message)
            {
                dynamic exceptionInstanceENG = System.Activator.CreateInstance(ex.GetType());

                str = exceptionInstanceENG.ToString() + ex.StackTrace;

            }
            else
            {
                str = ex.ToString();
            }
            Thread.CurrentThread.CurrentUICulture = currentCulture;

            return str;

        }
        catch (Exception)
        {
            Thread.CurrentThread.CurrentUICulture = currentCulture;

            return ex.ToString();
        }
-1
répondu user3472484 2014-03-28 11:57:35

pour les besoins de la journalisation, certaines applications peuvent avoir besoin de récupérer le message d'exception anglais (en plus de l'afficher dans la culture habituelle du client).

à cet effet, le code suivant:

  1. change la culture actuelle
  2. recrée l'objet d'Exception lancé en utilisant "GetType()" & "activateur.CreateInstance (t) 151970920"
  3. affiche le Message de la nouvelle Exception UICuture
  4. et puis finalement change la culture actuelle de nouveau à la culture antérieure.

        try
        {
            int[] a = { 3, 6 };
            Console.WriteLine(a[3]); //Throws index out of bounds exception
    
            System.IO.StreamReader sr = new System.IO.StreamReader(@"c:\does-not-exist"); // throws file not found exception
            throw new System.IO.IOException();
    
        }
        catch (Exception ex)
        {
    
            Console.WriteLine(ex.Message);
            Type t = ex.GetType();
    
            CultureInfo CurrentUICulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
    
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");
    
            object o = Activator.CreateInstance(t);
    
            System.Threading.Thread.CurrentThread.CurrentUICulture = CurrentUICulture; // Changing the UICulture back to earlier culture
    
    
            Console.WriteLine(((Exception)o).Message.ToString());
            Console.ReadLine();
    
         }
    
-1
répondu Ron16 2017-03-16 10:40:56