Laden...

Zeilennummer und Dateinamen einer Funktion auslesen ohne Exception

Erstellt von Shera vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.350 Views
S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 10 Jahren
Zeilennummer und Dateinamen einer Funktion auslesen ohne Exception

Hey,

wir haben nen kleines Problem und unser Workaround ist ein bisschen unschön 😉

Teilweise treten bei uns im Programm "Errors" auf. Zum Beispiel hat ein Benutzer einen falschen Parameter übergeben, was dann dafür sorgt, das nicht alles so läuft wie es soll. Da der Programmfluss weitergeht und eventuell Standardparameter ausgewählt wurden, wird keine Exception geworfen. Wir wollen aber trotzdem wollen wir an unseren ErrorLog eine Nachricht schicken:
"Falscher Parameter für Wert 'Länge' eingetragen ... "

Gleichzeitig wollen wir noch mitreichen in welcher Datei und Zeilennummer, das aufgetreten ist. Dynamisch natürlich.

Wir wollen ja nicht bei jeder Funktion 2 Parameter mitgeben "Zeilennummer 123, Datei XYZ" und, wenn dann ne Funktion davor eingefügt wird, erstmal alle Funktionen anpassen und aktualisieren, da sich die Zeilennummer ja ein wenig geändert hat.

Unser Workaround momentan ist:
Schmeiß ne Exception und fang sie direkt ab und schicke die Nachricht und nehme die Zeilennummer und den Dateinamen aus der Exception.

Aber das ist unschön.
Gibt es ne Möglichkeit das dynamisch OHNE eine Exception zu werfen, auszulesen ? Via Stacktrace oder so eventuell ?

Grüße,
Shera

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Shera,

du kannst einfach so ein neues StackTrace-Objekt erstellen. Eine Exception brauchst du dazu nicht.

Dass es die Pseudo-Macros LINE und FILE aus C in C# nicht gibt, habe ich auch schon mehrfach bedauert, aber das ist leider so. Siehe auch Suche Variable für Filename oder Methode für optionale Argumente (C# 5.0?) ff.

herbivore

T
2.224 Beiträge seit 2008
vor 10 Jahren

Hab heute ein ähnliches Problem gehabt.

Billig Lösung:


new StackTrace(true).ToString();

@herbivore
Ich hatte in C++ früher nie damit gearbeitet, weshalb ich dies nicht vermisse 😃
Wäre naürlich auch schön wenn es solche Möglichkeiten geben würde.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

2.207 Beiträge seit 2011
vor 10 Jahren

Hallo Shera,

ach mist, zu langsam 😉

Dennoch: Der StackTrace ist genau das, was du suchst. Der gibt genaue Infos wo die Expection passiert ist. Wenn du jetzt noch schaust, wo genau du Exeptions behandelst muss das gnaze auch nicht unschön sein.

Exception.StackTrace-Eigenschaft

Gruss

Coffeebean

T
2.224 Beiträge seit 2008
vor 10 Jahren

@Coffeebean
Er will den StackTrace ohne Exception, also eigentlich die Aufrufe in sauberen Code verfolgen.

T-Virus

Hinweis von herbivore vor 10 Jahren

... was ja auch möglich ist, siehe weiter oben.

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 10 Jahren

Danke danke an euch 3

Das ging ja sehr sehr sehr schnell 😉

PS:
Dank euch verschiebt sich meine Mittagspause jetzt nach hinten 😛

3.825 Beiträge seit 2006
vor 10 Jahren

ich habe meine Fehlermeldungen einfach durchnummeriert, dann findet man die Stelle, an der die Meldung ausgegeben wurde, ganz schnell im Sourcecode.

Das geht ganz fix (wenn man an den Azubi delegiert).

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

U
1.688 Beiträge seit 2007
vor 10 Jahren

Hallo,

in .Net 4.5 kann man das CallerLineNumber-Attribut verwenden. Da dies vom Compiler implementiert wird, ist es deutlich schneller, als ein Stracktrace zur Laufzeit.

849 Beiträge seit 2006
vor 10 Jahren

Und hat den Vorteil das es auch ohne die pdb Dateien funktioniert.

C
2.121 Beiträge seit 2010
vor 10 Jahren

Du könntest auch den Namen der aktuellen Methode auslesen und den verwenden. Der sagt fast genauso viel über den Ort eines Fehlers aus und ist resistent gegen im Nachhinein eingefügten oder gelöschten Code 😃
Das könntest du zum Beispiel aus einer extra Methode tun, die aus dem StackStace die Aufrufermethode rausfindet und als String zurückgibt.

P
64 Beiträge seit 2011
vor 10 Jahren

Hallo,

da stellt sich eine Frage, wozu das Ganze?

Das du Eingaben von Benutzern sowieso auf jeden Fall und immer überprüfen musst ist ein ganz normaler Vorgang. Was bringt es, wenn du weist, wo es falsch war?

PS: Ich meine damit, prüfe die Eingaben vor der Benutzung und mahne falsche an.

Grüße,

S
Shera Themenstarter:in
52 Beiträge seit 2011
vor 10 Jahren

Es sind nicht immer die Benutzereingaben.
Aber, es geht eben darum, das selbst, wenn ein Benutzer falsche Werte eingibt, alles weiterläuft.

Dann wird nur eine Warnung abgespeichert, das da ein Standardwert genommen wurde.

Ist auch nur ein Beispiel.
Wir haben in unserem Quelltext eben Exceptions und Warnungen, die auftreten können und die sollen alle aufgelistet werden