STL: try mist[-1] catch ... läuft nicht in den catch



  • Hallo Forum,

    ich hoffe, meine Frage ist nicht schon 100 mal beantwortet worden (dann bin ich zu dumm, die richtigen Suchbegriffe einzugeben).

    Hier mein Problem schematisch dargestellt:

    std::vector<int> HF_NZ;
    int index=-1;
    try
    {
     for (irgendwas)
      if (irgendwas < nochwichtiger)
       index = nochwichtiger;
     HF_NZ[index]++;
    }
    catch (...)
     // LOG("Der Programmierer hat Mist gebaut - kontaktieren Sie ihn");
    

    - Kompiler ist Visual Studio 2007
    - Enable C++ Exceptions steht auf "Yes with SEH Exceptions (/EHa)"
    - Ich nutze ausschließlich die STL
    - Ich habe vergessen, index auf einen gültigen Wert zu überprüfen
    - Trotzdem läuft der Abschnitt auch in der Release-Variante nicht in den Catch-Block, stattdessen bricht das Programm ab.

    Oder verbal formuliert: Ich habe so ziemlich alles in Try-Catch-Blöcke gefasst, damit die Serveranwendung (läuft als Dienst) unter keinen Umständen abkachelt, auch wenn ich als Entwickler eine Überprüfung vergessen haben sollte. Leider klappt das nicht immer. Wo mache ich den Fehler?

    Vielen Dank.



  • Der []-Operator von std::vector wirft keine exception. Da bist du selbst verantwortlich,dass die Werte stimmen. Wenn du eine exception willst, benutze die Memberfunktion std::vector::at() .



  • Hallo drakon,

    vielen Dank für den Hinweis.

    In meiner Naivität hätte ich jetzt vermutet, daß ein Schreibzugriff auf array[falsch] wenigstens dann in catch(...) läuft, wenn das Programm anderweitig abgebrochen würde (z.B. weil array[falsch] auf einen ungültigen Speicherbereich zeigt oder noch schlimmer array[falsch]=irgendwas den auszuführenden Code korrumpiert.

    Im Grunde möchte ich folgendes erreichen (wieder nur schematisch):

    main ()
    {
     while (true)
      WaitForSoapRequest(befehl);
      try
      {
       StartNewThread(befehl)
      }
      catch (...)
       printf("Rügen Sie den Entwickler");
    }
    

    Sprich: Wenn schon der Thread abkachelt, soll wenigstens Main() weiter laufen (idealerweise gibt der Thread zuvor aus, wo ungefähr der Hase im Pfeffer liegt, aber das ist Nebenschauplatz).

    Dies sollte idealerweise auch dann zuverlässig greifen, wenn der Benutzer Sachen macht, von denen der Entwickler nie zu träumen gewagt hätte. 😉 😃

    Nebenbei: at() möchte ich in den innersten Schleifen möglichst vermeiden (ich befürchte zu viel Overhead).



  • Harvey schrieb:

    Im Grunde möchte ich folgendes erreichen (wieder nur schematisch):

    main ()
    {
     while (true)
      WaitForSoapRequest(befehl);
      try
      {
       StartNewThread(befehl)
      }
      catch (...)
       printf("Rügen Sie den Entwickler");
    }
    

    Sandboxen.
    Pack StartNewThread in einen eigenen prozess. Wenn der abschmiert kann dir das egal sein.

    Nebenbei: at() möchte ich in den innersten Schleifen möglichst vermeiden (ich befürchte zu viel Overhead).

    Naja, entweder du hast overhead durch sicherheitschecks und eine exception fliegt oder du hast keinen overhead und eben auch keine sicherheitschecks.



  • Harvey schrieb:

    (ich befürchte zu viel Overhead).

    Was du fürchtest und was dann am Ende Tatsache ist muss nicht miteinander überienstimmen. Google/wikipedia mal nach "Premature Optimization"...



  • pumuckl schrieb:

    Harvey schrieb:

    (ich befürchte zu viel Overhead).

    Was du fürchtest und was dann am Ende Tatsache ist muss nicht miteinander überienstimmen. Google/wikipedia mal nach "Premature Optimization"...

    Google/wikipedia mal nach "Premature Pessimization"...



  • wenn volkard das sieht, löscht er euch aus



  • @ Harvey
    Kommt halt drauf an, was du brauchst. Wenn du die Indizes prüfen willst, dann nimm at() , da kannst du nicht viel schneller machen. Ansonsten nimmst du halt operator[] und riskierst je nachdem undefiniertes Verhalten.


Anmelden zum Antworten