Frage

Im Rahmen der Fehlerbehandlung in unserem Produkt möchten wir einige Stack-Trace-Informationen ausgeben.Wir haben jedoch die Erfahrung gemacht, dass viele Benutzer einfach einen Screenshot des Fehlermeldungsdialogs machen, anstatt uns eine Kopie des vollständigen Berichts zu senden, der im Programm verfügbar ist. Daher möchte ich in diesem Dialog einige minimale Stack-Trace-Informationen verfügbar machen.

Ein .NET-Stack-Trace auf meinem Rechner sieht so aus:

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

Ich habe diese Frage:

Das Format sieht folgendermaßen aus:

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

Allerdings ist die bei Und In Ich gehe davon aus, dass diese Schlüsselwörter lokalisiert werden, wenn sie beispielsweise eine norwegische .NET-Laufzeitumgebung anstelle der von mir installierten englischen Version ausführen.

Gibt es eine Möglichkeit für mich, diesen Stack-Trace sprachneutral auseinanderzunehmen, sodass ich nur die Datei- und Zeilennummer für die Einträge anzeigen kann, die dies haben?

Mit anderen Worten, ich hätte gerne diese Informationen aus dem obigen Text:

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

Jeder Rat, den Sie geben können, wird hilfreich sein.

War es hilfreich?

Lösung

Sie sollten in der Lage sein, ein StackTrace-Objekt anstelle einer Zeichenfolge zu erhalten, indem Sie sagen

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

Anschließend können Sie sich die Frames selbst ansehen, ohne sich auf die Formatierung des Frameworks verlassen zu müssen.

Siehe auch: StackTrace-Referenz

Andere Tipps

Hier ist der Code, den ich verwende, um dies ausnahmslos zu tun

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

Nur um dies zu einer 15-sekündigen Copy-Paste-Antwort zu machen:

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

(basierend auf Lindholms Antwort)

Oder es gibt eine noch kürzere Version.

Console.Write(exception.StackTrace);

Als Alternative lieferte mir log4net, obwohl potenziell gefährlich, bessere Ergebnisse als System.Diagnostics.Grundsätzlich haben Sie in log4net eine Methode für die verschiedenen Protokollebenen, jeweils mit einem Ausnahmeparameter.Wenn Sie also die zweite Ausnahme übergeben, wird der Stack-Trace an den von Ihnen konfigurierten Appender gedruckt.

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

Die Ausgabe sieht je nach Konfiguration etwa so aus:

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
   ...
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top