PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# Nur eigene Exception-Messages ausgeben


()V()r.Freeze
2011-06-10, 20:20:35
Hi all,

ich habe eine eigene Exception-Klasse "ValidationException". Bei einem Validierungsfehler einer bestimmten Objektart schreibe ich einen String in die Instanz der Exception und werfe diese:

valiEx = new ValidationException("Fehler Nr. Blabla", innerexception)

Die Innerexception wird aus der untergeordneten Validierung geliefert, z.B. für ein bestimmtes Datenfeld.
Ich möchte nun eine Fehlermeldung erstellen in der quasi steht: Fehler bei der Validierung: Fehler Nr. Blabla. Ursache: innerexception.Text usw.

Das funktioniert auch alles, aber in der valiEx.toString() steht nun der gesamte Stacktrace aller Aufrufe und Exceptions - nicht nur der von mir gesetzte Text. Weiß jemand Abhilfe?

PatkIllA
2011-06-10, 20:32:21
Einfach in einer Schleife jeweils das Message-Property auslesen und dann mit der InnerException weitermachen bis diese null ist.
Direkt die innerste Exception kannst du mit GetBaseException auslesen.

()V()r.Freeze
2011-06-10, 20:42:42
Einfach in einer Schleife jeweils das Message-Property auslesen und dann mit der InnerException weitermachen bis diese null ist.
Direkt die innerste Exception kannst du mit GetBaseException auslesen.

Genau das mache ich im Moment. Ich beginne mit einem leeren String. In einer Schleife fülle ich diesen mit der Property aktuelleValidationException.Message. Es ergibt sich jedoch ein ellenlanger String der nicht nur meine eigenen Messages enthält sondern das ganze Gelumps mit ValidationException bei Methodexy bei Methodeab bei usw.

PatkIllA
2011-06-10, 20:45:29
Exception x in Methode y steht praktisch nie in der Message. Das ist fast immer nur ein kurzer Satz.
Zumindest bei den .NET Exceptions.

()V()r.Freeze
2011-06-10, 20:47:38
Ahhh. Sorry. Hab jetzt erst kapiert was du eigentlich meintest. Damit könnte es gehen. Probiers mal.

Gast
2011-06-12, 22:48:08
Die Klasse Exception hat folgende Funktionen/Properties:

Exception.Message: Die Nachricht
Exception.StackTrace: Der StackTrace der Exception
Exception.innerException: Die innerException bzw. nothing

Exception.ToString: Die Message, der StackTrace, regionalspezifische Trennzeile, der Rückgabewert von innerException.ToString falls vorhanden

Zu deinem Beispiel:

Try

Catch ex As YourValidationException
String.Format("Fehler bei der Validierung: ""{0}"". Ursache: ""{1}""", Exception.Message, innerException.toString)

Achtung: Bei Exceptions, die man nicht selbst erzeugt hat, sollte man generell nie nur die Message ausgeben bzw. loggen, sondern immer die Ausgabe von .toString. Oft hat man sonst nur irgendeine IndexOutOfBoundsException oder NullReferenceException und ist erst nicht schlauer als vorher.

Weiters solltest du immer die .pdb Files mitliefern, dann hast du auch Zeilenangaben in den Exceptions.
End Try

Gast
2011-06-12, 22:50:06
Sorry sehe gerade du verwendest C#, bleibt am im Prinzip das Selbe:

Try
{

}
Catch YourValidationException ex
{
String.Format("Fehler bei der Validierung: \"{0}\". Ursache: \"{1}\"", Exception.Message, innerException.toString);
}
End Try

()V()r.Freeze
2011-06-14, 23:03:10
@Gast: Danke, genau so habe ich es jetzt gemacht.