Question

Dans le cadre de la gestion des erreurs dans notre produit, nous aimerions supprimer certaines informations de trace de pile.Cependant, nous constatons que de nombreux utilisateurs prendront simplement une capture d'écran de la boîte de dialogue du message d'erreur au lieu de nous envoyer une copie du rapport complet disponible à partir du programme, et j'aimerais donc rendre disponibles quelques informations minimales sur la trace de la pile dans cette boîte de dialogue.

Une trace de pile .NET sur ma machine ressemble à ceci :

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)
at System.IO.StreamReader..ctor(String path)
at LVKWinFormsSandbox.MainForm.button1_Click(Object sender, EventArgs e) in C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36

J'ai cette question :

Le format semble être le suivant :

at <class/method> [in file:line ##]

Cependant, le à et dans mots-clés, je suppose qu'ils seront localisés s'ils exécutent, disons, un runtime .NET norvégien au lieu de celui anglais que j'ai installé.

Existe-t-il un moyen pour moi de séparer cette trace de pile d'une manière indépendante de la langue, afin de pouvoir afficher uniquement le numéro de fichier et de ligne pour les entrées qui en contiennent ?

En d’autres termes, j’aimerais cette information du texte ci-dessus :

C:\Dev\VS.NET\Gatsoft\LVKWinFormsSandbox\MainForm.cs:line 36

Tous les conseils que vous pourrez donner seront utiles.

Était-ce utile?

La solution

Vous devriez pouvoir obtenir un objet StackTrace au lieu d'une chaîne en disant

var trace = new System.Diagnostics.StackTrace(exception);

Vous pouvez ensuite regarder les cadres vous-même sans vous fier au formatage du framework.

Voir également: Référence StackTrace

Autres conseils

Voici le code que j'utilise pour le faire sans exception

public static void LogStack()
{
  var trace = new System.Diagnostics.StackTrace();
  foreach (var frame in trace.GetFrames())
  {
    var method = frame.GetMethod();
    if (method.Name.Equals("LogStack")) continue;
    Log.Debug(string.Format("{0}::{1}", 
        method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
        method.Name));
  }
}

Juste pour en faire une réponse copier-coller de 15 secondes :

static public string StackTraceToString()
{
    StringBuilder sb = new StringBuilder(256);
    var frames = new System.Diagnostics.StackTrace().GetFrames();
    for (int i = 1; i < frames.Length; i++) /* Ignore current StackTraceToString method...*/
    {
        var currFrame = frames[i];
        var method = currFrame.GetMethod();
        sb.AppendLine(string.Format("{0}:{1}",                    
            method.ReflectedType != null ? method.ReflectedType.Name : string.Empty,
            method.Name));
    }
    return sb.ToString();
}

(basé sur la réponse de Lindholm)

Ou il existe une version encore plus courte.

Console.Write(exception.StackTrace);

Comme alternative, log4net, bien que potentiellement dangereux, m'a donné de meilleurs résultats que System.Diagnostics.Fondamentalement, dans log4net, vous disposez d'une méthode pour les différents niveaux de journalisation, chacun avec un paramètre Exception.Ainsi, lorsque vous transmettez la deuxième exception, la trace de la pile sera imprimée sur l'appender que vous avez configuré.

exemple: Logger.Error("Danger!!!", myException );

La sortie, selon la configuration, ressemble à ceci :

System.ApplicationException: Something went wrong.
   at Adapter.WriteToFile(OleDbCommand cmd) in C:\Adapter.vb:line 35
   at Adapter.GetDistributionDocument(Int32 id) in C:\Adapter.vb:line 181
   ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top