2013-02-20 6 views
5

C# -Referenz für eckige Klammern sagt: Eckige Klammern [] werden für Arrays, Indexer und Attribute verwendet. Sie können auch mit Zeigern verwendet werden. (Dies gilt auch für Arrays) Eine Ausnahme wird ausgelöst, wenn ein Array-Index außerhalb des Bereichs liegt.Wie ermittelt man, welche Ausnahmen "x []" auslösen könnte?

Also, wenn Sie eckige Klammern auf etwas anderes als ein Array verwenden, woher wissen Sie dann, welche Ausnahmen ausgelöst werden könnten? Wenn Sie Accessormethoden wie Dictionary.TryGetValue verwenden, können Sie die Ausnahmen, die die Methode auslösen kann, leicht nachschlagen, aber die C# reference for square brackets [] sagt nur, dass sie eine Exception für einen Index außerhalb des Bereichs auf Arrays auslösen könnte.

Also, wenn Sie die eckigen Klammern für einige Datentyp verwenden möchten, wo können Sie suchen, welche Ausnahmen für diesen Datentyp ausgelöst werden könnten?

Ich versuchte, auf ein nicht vorhandenes Mitglied eines Dictionary zuzugreifen, nur um zu sehen, was passiert, und ich bekam KeyNotFoundException. Ich weiß, dass Sie auch NullReferenceException erhalten können. Wo ist das dokumentiert? Und was ist die komplette Liste?

+1

Warum brauchen Sie eine Liste? Würde ein generischer 'catch (Exception ex) 'nicht funktionieren? – DiskJunky

+1

@DiskJunky, das Abfangen der generischen Ausnahme ist eine ungute Übung (außer auf der obersten Ebene, wenn Sie es möglicherweise protokollieren und noch auswerfen). –

+0

@pst vereinbart, auch wie es überlastet werden kann, können Sie Ihre eigene Indizierung Umsetzung implementieren und werfen, was auch immer Sie mögen :) – RobJohnson

Antwort

4

Es ist mit jeder Implementierung dokumentiert. Es gibt keine erschöpfende Liste, da der Operator überlastet werden kann, so dass theoretisch jede Ausnahme ausgelöst werden könnte. Der Bediener wird normalerweise als Item Eigenschaft dokumentiert.

Hier einige Dokumentation auf spezifische Verwendungen:

Dictionary.Item

Array.Item

Sie sollten jedoch keine erschöpfende Liste müssen auf welchem ​​könnte geworfen werden. Ausnahmen werden in der Regel aus einem von zwei Gründen abgefangen: Entweder möchten Sie tun etwas darüber (wie die Tage vor TryParse wenn eine Ausnahme war der einfachste Weg, ein falsches Datum Format zu fangen) oder Sie möchten nur, dass eine Ausnahme zu beachten aufgetreten und protokollieren, in welchem ​​Fall Sie in der Regel die tatsächliche Ausnahme wiederholen.

Das Abfangen bestimmter Ausnahmen ist gut für den ersten Fall. Wenn Sie zum Beispiel ein NullReferenceException fangen es in der Regel eine andere Ausnahme erneut zu werfen, die gibt an, welche Referenz null ist (da dies nicht Teil des Bestandes ist NullReferenceException).

Im letzteren Fall, Fangen eine generisches Exception in Ordnung ist wenn Sie nur wollen, melden Sie sich und Wiederwurf, da es sonst wahrscheinlich nichts ist kann man dagegen tun.

+0

Danke - ich will eigentlich nicht wissen, was * könnte * geworfen werden, um alles zu wissen. Ich möchte nur wissen, was gültig ist, damit ich mir dann vorstellen kann, ob ich damit umgehen will oder nicht. Fall und Punkt: In meiner Frage habe ich gesagt, dass das Dictionary NullReferenceException auslösen könnte, aber wie sich herausstellt, kann man unter den Item-Eigenschaften tatsächlich ArgumentNullException werfen. Wenn ich Code schreibe, um die NullReferenceException zu erfassen, denke ich, dass ich meine Spuren verdecke, aber ich schreibe törichterweise Müllcode. –

+0

@EdwardNedHarvey - nun, "Müll" ist stark. Wenn Sie nur "NullReferenceException" abfangen und eine 'ArgumentNullException' auslösen, wird die Ausnahme nur noch durch den Code oder den Framework-Code ausgelöst. –

+0

@D Stanley Punkt ist, ohne nachschlagen die tatsächliche Ausnahme, die geworfen werden könnte, bin ich anfällig für Code zu schreiben, denke, ich fange eine Ausnahme, die ich nicht fange. Wenn ich es dann debugge, sehe ich, dass es eine "Null" -Ausnahme gibt, aber es hat keine "Null" -Ausnahme bekommen, aber der Code sagt "Null", bis ich im Kreis herumlaufe und schließlich herausfinde, dass da mehr ist eine andere Art von "Null" -Ausnahme. Yup, das wäre Müllcode. Schlimmer als Müll. Ich bin froh, jetzt die Antwort auf diese Frage zu haben, also werde ich diesen Fehler nicht machen, und ich kann nach Orten suchen, die ich bereits gemacht habe. –

1

Im Allgemeinen können Sie mit eckigen Klammern im Wesentlichen auf eine indexierte Eigenschaft zugreifen - also welcher Fehler auch immer im Property-Indexer des von Ihnen verwendeten Objekts erwähnt wird.

Bei Arrays kann es sein, dass der Index außerhalb des Bereichs liegt, für DataRow kann die Spalte nicht gefunden werden und so weiter.

4

wenn die [] Operator auf ein Dictionary < TKey angewendet wird, TValue > oder Liste <T>, ruft sie die Instanz indexer. Ein Indexer ist eine spezielle Eigenschaft mit Parametern und ist typischerweise Item genannt.

  • Dictionary<TKey, TValue>.Item Property
    Argument – Schlüssel ist null.
    KeyNotFoundException – Die Eigenschaft wird abgerufen und Schlüssel ist nicht in der Sammlung vorhanden.

  • List<T>.Item Property
    ArgumentOutOfRangeException – Index kleiner als 0 -oder Index oder größer als Count gleich ist.

  • ...

1

Wenn verwendet, um ein Array zuzugreifen, kann es eine IndexOutOfRangeException werfen.

Wenn es für ein Attribut verwendet wird, kann es keine Ausnahme auslösen, da jeder Fehler während der Kompilierung auftreten würde.

Wenn auf einen Indexer zugegriffen wird, kann er jede Ausnahme auslösen. Der Indexer kann beliebig implementiert werden und beliebige Ausnahmen auslösen.

Verwandte Themen