try, catch hat keine Wirkung?
-
Dravere schrieb:
Bei mir (MSVC 2005) ist die Fehlermeldung auch nicht viel besser:
"invalid vector<T> subscript"Was hättest Du denn gern? Die Meldung sagt doch alles.
-
LordJaxom schrieb:
Dravere schrieb:
Bei mir (MSVC 2005) ist die Fehlermeldung auch nicht viel besser:
"invalid vector<T> subscript"Was hättest Du denn gern? Die Meldung sagt doch alles.
Hast du ein Smilie vergessen? Zum Beispiel so eins ->

Wenn nicht und du das wirklich ernst meinst, dann muss ich dir zustimmen, die Meldung sagt wirklich alles. Es könnte x-beliebig was passiert sein. Ein Unknown error wäre genau so gut :pGrüssli
-
"Ungültiger Vektorindex". Stimmt, wie kann man das nur verstehen? Da sollte stehen: "Hallo lieber Programmierer, es sieht so aus als hätten Sie versucht auf ein Vektorelement zuzugreifen, das nicht existiert. Soll ich (1) den Vektor entsprechend vergrößern, (2) den Vorgang an Microsoft melden?"
-
Ach du Schande ... Tja, jetzt erkenn ich den Fehler, mein Englisch weisst Lücken auf.
Subscript heisst Index? Ein Index ist für mich immer noch ein Index, auch im Englischen. Während ein subscript für mich eher ein Script innerhalb eines anderen Scripts ist. Daher verstand ich die Fehlermeldung eher als "Fehler im Code!", was nichtsaussagend wäre.Aber man lernt nie aus, danke für die Nachhilfe ^^
Grüssli
-
Sub\1: An (im Deutschen heißt das Index)
Super\1: An
-
Kann man mit C++09 den Fehler von ganz oben abfangen?
-
Ich hatte ernsthaft überlegt, wie man die Meldung detaillierter gestalten hätte können - Erwähnung des Index, des Typs, der Methode? Schade, dass es sich nur um ein sprachliches Missverständnis gehandelt hat, denn ich hätte zu allen Gegenargumente gefunden

Zum Sprachlichen gebe ich aber zu, dass sich mir als COBOL-Vorbelasteter "subscript out of range" bereits mehr oder weniger ins Hirn eingebrannt hat.

-
danextc++ schrieb:
Kann man mit C++09 den Fehler von ganz oben abfangen?
nein. das man das nicht kann und das ist eine bewusste entscheidung. der operator[] soll ein low-level-operator sein, der von der geschwindigkeit her dem aus c gleichwertig sein soll, daher kann man keine bereichsprüfung direkt einbauen und folglich auch nichts werfen. wenn du sicherheit haben willst, benutze die schon erwähnten at()-funktion, dafür gibt es sie.
-
ghorst schrieb:
danextc++ schrieb:
Kann man mit C++09 den Fehler von ganz oben abfangen?
nein. das man das nicht kann und das ist eine bewusste entscheidung. der operator[] soll ein low-level-operator sein, der von der geschwindigkeit her dem aus c gleichwertig sein soll, daher kann man keine bereichsprüfung direkt einbauen und folglich auch nichts werfen. wenn du sicherheit haben willst, benutze die schon erwähnten at()-funktion, dafür gibt es sie.
Nein, stimmt nicht ganz. Der []-Operator muß keine, aber darf eine Bereichsprüfung vornehmen! Benutze mal MSVC2005 und neuer, dort wird genau das gemacht: die []-Operatoren und Iteratoren machen standardmäßig eine Gültigkeitsprüfung (gehört zur neuer MS-Sicherheitstrategie). Wer das nicht will, muß es explizit abschalten.
-
Schneeflocke schrieb:
Nein, stimmt nicht ganz. Der []-Operator muß keine, aber darf eine Bereichsprüfung vornehmen!
Es dürfen auch Dämonen aus der Nase fliegen. Das ist eben undefiniertes Verhalten.
-
-
Hi,
nur, weils noch keiner geschrieben hat:
lord_fritte schrieb:
... catch(exception ex) ...Es gibt verschiedene Gründe, warum man Exceptions besser per Referenz fangen sollte:
... catch(exception& ex) ...Gruß,
Simon2.
-
lord_fritte schrieb:
Ja, und das ist auch Sinn der Sache.
Wenn dein Code so wackelig ist, dass du per Default eine Bereichsprüfung brauchst, dann nimm halt std::vector::at.
-
MFK schrieb:
Wenn dein Code so wackelig ist, dass du per Default eine Bereichsprüfung brauchst, dann nimm halt std::vector::at.
Oder lass es noch besser garnicht erst zur Exception kommen sondern frage size() ab und schau ob der Index auf den du zugreifen willst existiert.
-
lord_fritte schrieb:
Nein - es ist halt nur so, dass man in seinem Programm auch Fehler machen kann, die nicht mittels try/catch erkennbar sind (z.B. bewusst einen "prüfungsfreien" operator[] zu verwenden).
Irgendwie geht halt nicht Beides: Keine Prüfung haben zu wollen UND gleichzeitig doch vor den eigenen Programmierfehlern geschützt zu sein.
(OK, für triviale Programme mag das möglich sein)Gruß,
Simon2.