try, catch hat keine Wirkung?



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


Anmelden zum Antworten