Die Methode Get-name, warf Ausnahme
Weiß ich. Eine ähnliche Frage wurde bereits gestellt.
aber ich habe nicht genau die Lösung aus, die.
Habe ich eine Schaltfläche click-Ereignis, in der ich eine Methode FillCombo()
.
Schaltfläche Click-Ereignis
private void button1_Click(object sender, EventArgs e)
{
try
{
cmbTemplates.Items.Clear();
lstFiles.Clear();
FillCombo();
}
catch (Exception ex)
{
MethodBase site = ex.TargetSite;
Log(ex.ToString(), site == null ? null : site.Name);
}
}
Wenn ich ausgetestet habe, fand ich, dass die exception Auftritt von FillCombo()
Methode. Nach, dass ich den Wert von site.Name
als WinIOError
statt FillCombo
.
Versuchte ich eine andere Methode GetExecutingMethodName()
die beantwortet wurde durch Chris Gessler in So bekommen Sie den Namen der Methode, die die Ausnahme verursacht hat Frage. Also habe ich versucht, den Versand der name der Methode, die die Ausnahme verursacht mit GetExecutingMethodName()
Methode
Log(ex.ToString(), GetExecutingMethodName());
Aber ich habe das Ergebnis als System.Windows.Forms.Control.OnClick
statt FillCombo
.
Wie bekomme ich den tatsächlichen Namen der Methode, die die Ausnahme verursacht?
- Haltepunkte setzen, um den code Debuggen und schauen stacktrace
- Ich kann wissen, in der Dubug-Modus. Aber ich muss melden Sie die Fehler in eine Datei. In der Produktion Umwelt, die ist zu gehen, zu sitzen und zu Debuggen!!! @saurabh64
- Sie sollte sich der gesamte stack-trace. Diese geben in der Regel genug Kontext, um festzustellen, das Problem.
I get the value of site.Name as WinIOError instead of FillCombo
. Das ist wahrscheinlich, weil IhreFillCombo
keine Ausnahme auslösen, sondern tiefer in Sie, wenn wir das Telefon in die framework-code, der die Ausnahme ausgelöst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
.net unterstützt immer die stack-trace-Daten aus einer Ausnahme. Sie konnte herausfiltern die Methode (und der name) durch die Prüfung mit dem ersten frame (Ursprung).
Dies würde Ihnen wahrscheinlich genau das gleiche wie die targetsite (die win-io -), aber Sie können überprüfen, dass der stacktrace für die erste Benutzer-code, oder das erste Bild in deiner Art, oder je nachdem, was Ihre Bedürfnisse.
Beispielsweise immer den Namen des Täters thrower in Ihrer aktuellen Baugruppe:
Exception.TargetSite
Eigenschaft? Und wie würde das bekommen die OP istFillCombo()
Methode name?FillCombo()
genannt hatte, eine andere MethodeFoo()
in der aktuellen Baugruppe, die dann genannt, in einigen anderen Bibliothek, die schließlich warf die Ausnahme, die oben zurückkehren würde, den Namen "Foo" und nicht "FillCombo". Wenn es das ist, was Sie wollen, sehr gut...ansonsten siehe meine Antwort.Ist es wichtig zu verstehen, was gemeint ist, durch "die Methode, die die Ausnahme ausgelöst". Wenn eine Ausnahme Auftritt, es gibt eine spezielle Methode, die tatsächlich ausgeführt wird. Nur weil irgendwann vor die Ausnahme, sind Sie aufgerufen, Ihre eigenen
FillCombo()
- Methode, das bedeutet nicht, dass die Methode, die die Ausnahme ausgelöst hat.Den
FillCombo()
Methode wird jedoch (in dem Fall du hier kümmern) werden in dem stack-trace. Das ist, warum es sinnvoll ist, melden Sie die gesamte stack-trace. In der Tat, ich in der Regel nur melden das ganzeException
Objekt (d.h.ex.ToString()
, oder geben Sie einfach die exception-Objekt zustring.Format()
oder ähnliches, rufenToString()
für Sie). Dies beinhaltet den Typ der Ausnahme, die Nachricht, das gesamte stack-trace, und sogar Ausnahme-Informationen, falls vorhanden.Der code, den Sie bekam von der anderen Frage, für die
GetExecutingMethodName()
- Methode, ist nicht wirklich sehr sinnvoll, IMHO. Sie werden bemerken, dass das, was es wirklich tut, ist kriechen durch den stack-trace des aktuellen Ausführung Lage, auf der Suche für die erste Methode, die deklariert ist, in einen anderen Typ als dem, in dem dasGetExecutingMethodName()
erklärt wurde.Dies ist falsch, für deinen Zweck aus zwei Gründen:
Click
event-handler deklariert ist. Dies bedeutet, dass die event-handler-Methode wird ignoriert, und so erhalten Sie die Aufrufer dieser Methode, dieControl.OnClick()
- Methode (D. H. die Methode, die tatsächlich das Ereignis auslöst).Ehrlich gesagt, finde ich, dass insbesondere die Antwort sonderbar, da .NETTO bietet bereits eine API für das abrufen der
MethodInfo
des aktuell ausgeführten Methode: MethodBase.GetCurrentMethod. Und dies ist viel zuverlässiger als die code-Chris Gessler schrieb.button1_Click()
Methode. Aber Sie wissen bereits, dass, da der code Sie schreiben zum behandeln der Ausnahme in Methode.Wenn Sie wissen wollen den Namen der Methode, in der Ihre aktuell ausgeführten Methode, die aufgerufen wird, bevor die Ausnahme aufgetreten ist, können Sie kombinieren die zwei Techniken: Holen Sie sich die Namen der aktuell ausgeführten Methode, und übergeben, eine Methode, die sowohl das als auch der stack-trace-string aus der
Exception
Objekt, und lassen Sie, dass die Methode parse der stack-trace-Zeichenfolge zu finden, den Rahmen einfach vor die derzeit ausgeführte Methode in der Spur.Es ist ein bisschen wie ein Schmerz, aber es getan werden könnte. Hier ist ein Beispiel, wie das Aussehen würde (einfache proof-of-concept-console-Programm):
Schließlich, im Hinterkopf behalten, dass aufgrund der Methode inlining und anderen Optimierungen, auch einen vollständigen stack-trace kann einige Unregelmäßigkeiten, einschließlich auch der eigentliche name der Methode, wo die Ausnahme ausgelöst wurde. Das ist ein weiterer Grund, dass die Protokollierung der gesamten
Exception
Objekt ist in der Regel viel nützlicher, je mehr Kontext, desto wahrscheinlicher werden Sie in der Lage sein, zu rekonstruieren, was passiert ist.Nur versuchen, diese: