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
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
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.
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
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
@Coffeebean
Er will den StackTrace ohne Exception, also eigentlich die Aufrufe in sauberen Code verfolgen.
T-Virus
... 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.
Danke danke an euch 3
Das ging ja sehr sehr sehr schnell 😉
PS:
Dank euch verschiebt sich meine Mittagspause jetzt nach hinten 😛
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
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.
Und hat den Vorteil das es auch ohne die pdb Dateien funktioniert.
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.
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,
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