Tag!
Ich hab ein Property in dem ich eine Exception auslösen will.
Wenn ich das mache wird mir als "Ursprung" das throw-Statement
angezeigt. z.B.
throw new System.NullReferenceException();
Ich möchte aber, dass der Aufruf des Properties angezeigt wird, in dem die Exception aus gelöst wurde. z.B.
Code:
if (Items.Count == 0)
(wobei "Count" für dieses Property steht)
Wer kann mir helfen?
Hallo bayeror,
wenn Item null ist, sollte Count gar nicht aufgerufen werden. Wenn es nicht null ist, ist es m.E. unpassend, eine NullReferenceException zu schmeißen. Vielleicht gibt es Gründe, die ich nicht sehe.
Die eigentliche Frage verstehe ich nicht ganz, denn die Exception enthält ja auch die Angabe von Item.Count - nur eben an zweiter Position.
Wenn du es unbedingt so willst, wie du schreibst, weiß ich erstmal nur eine Teillösung. Mit 'new StackTrace (1)' bekommt man einen StackTrace ohne die aufrufende Methode.
herbivore
hallo herbivore!
wenn Item null ist, sollte Count gar nicht aufgerufen werden. Wenn es nicht null ist, ist es m.E. unpassend, eine NullReferenceException zu schmeißen
Da hast du recht. Items.Count war nur ein Beispiel.
Ich hab u.a. ein Property "IsInitialized" vom Typ bool für ein Control. (Ich sollte dazusagen dass es sich um eine WebControl in ASP.Net handelt.) Zu bestimmten Zeitpunkten möchte ich den Zugriff auf dieses Property verweigern bzw. klarmachen, dass diese Eigenschaft nicht zur Verfügung steht. Ich würde am liebsten null zurückgeben, aber beim bool wird mir nichts anderes übrig bleiben als eine NullReferenceException zu schmeißen.
Im Prinzip funktioniert das, aber der Ursprung der Exception ist das schmeißen der Exception, also "throw new System.NullReferenceException();" selbst. Wenn mit diesem Control gearbeitet wird und eine Exception auftritt bei der der Ursprung der eben genante ist und nicht der Aufruf/Zugriff auf das Property, kann der Entwickler nicht viel damit anfangen. Klar kann er über den Stack Trace nachschauen, aber ich finde das unschön. Z.B. ist der Ursprung beim "reader.GetValue(0);", wenn kein Datensatz vorhanden ist ja auch der Funktionsaufruf und nicht das Statement bei dem in der GetValue-Funktion die Exception geworfen wurde.
Ich denke, diesmal kann man verstehen was ich will.
Mit 'new StackTrace (1)' bekommt man einen StackTrace ohne die aufrufende Methode Wie meinst du das? Das Exception.StackTrace ist schreibgeschützt und ein string.
Hallo bayeror,
unter 2.0 gibt es die Klasse Nullable, mit der auch für Werttypen wie bool das Zurückgeben von null möglich wird.
Wie meinst du das? Das Exception.StackTrace ist schreibgeschützt und ein string.
Das ist mit klar. Deshalb schrieb ich ja auch "nur eine Teillösung".
herbivore
unter 2.0 gibt es die Klasse Nullable, mit der auch für Werttypen wie bool das Zurückgeben von null möglich wird.
das wär halt schon top, aber leider haben wir noch nicht das 2.0er.
Was wäre für die Exception-Variante die Lösung.
Mach doch ein weiteres bool Property CanAccess
Dann kann man jeweils so coden
if (xy.CanAccess && xy.IsInitialized)
{
//mach was
}
Durch die logische AND Verknüpfung wird IsInitialized gar nicht abgefragt wenn der Zugriff nicht erlaubt ist.
PS: Ich fände es unschön wenn IsInitialized ne Exception wirft !!
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Dann müsst ich ja für mehrere Properties zusätzlich noch je ein Property zur Verfügung stellen, das angibt, ob ich Zugriff auf die eigentliche Information habe oder nicht.
Außerdem muss ich IsInitialized entweder mit true oder false initialisieren. Ich will mich nicht unbedingt darauf verlassen dass immer das CanAccess mit abgefragt wird. Ich persönlich fände das auch lästig.
Und ich glaube, das mit der Exception schon ok. So wird man auf den Fehler hingewiesen. Mit dem Zusatzproperty, wenn vergessen, treten manchmal Ungereimtheiten auf und man weiß nicht genau worans liegt.
Wenn wer ne Lösung für mein Problem hat, wär ich echt dankbar. Es muss ja irgendwie gehen, bei den Klassen vom Framework funktionierts ja auch.