Laden...

Exception Ursprung weitergeben

Erstellt von bayeror vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.546 Views
bayeror Themenstarter:in
21 Beiträge seit 2004
vor 18 Jahren
Exception Ursprung weitergeben

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?

49.485 Beiträge seit 2005
vor 18 Jahren

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

bayeror Themenstarter:in
21 Beiträge seit 2004
vor 18 Jahren

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.

49.485 Beiträge seit 2005
vor 18 Jahren

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

bayeror Themenstarter:in
21 Beiträge seit 2004
vor 18 Jahren

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.

4.221 Beiträge seit 2005
vor 18 Jahren

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...

bayeror Themenstarter:in
21 Beiträge seit 2004
vor 18 Jahren

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.