Robert B.: Wozu Exception Objects

Beitrag lesen

Moin,

Machen mehrere Instanzen von Exceptionklassen einen Sinn? Denn das hieße ja, daß man spätestens beim Erstellen der 2. Exceptioninstanz die 1. Exception ignoriert hat!

das hat seinen Sinn, sobald du mehrere Stellen hast, an denen Exceptions geworfen werden können, vielleicht sogar parallel.

Genau diese Stellen setzt man in einen try{}Block. Und wenn man 2 dieser möglichen Stellen in einen try{}Block setzt, sollte man daran denken, daß eine 2. EX gar nicht fallen kann wenn die 1. EX gefallen ist. catch() kriegt also entweder die eine oder die andere Ursache übergeben.

Wenn du wissen möchtest, welchen Sinn mehrere Exception-Objekte in einem try-catch-Block haben, dann frage bitte auch dementsprechend. Meine Antwort hat sich auf die oben zitierte allgemeine Frage nach dem Sinn mehrerer Exception-Objekte in einem Programm (Thread?) bezogen.

Natürlich kann von den verschiedenen möglichen Exceptions immer nur eine fallen, aber es kann es eine der verschiedenen sein, in dem Taschenrechnerbeispiel neben der Division durch Null z.B. auch eine Unter- oder Überschreitung des Wertebereichs oder in dem Beispiel mit der Parser-Exception könnte es auch eine Exception der darunterliegenden IO-API sein, lies: Das Parsen kann fehlschlagen, wenn nicht aus der Datei gelesen oder der Dateiinhalt fehlerhaft ist.

In Form

1. eines Literals
2. oder einer Referenz
3. oder einer Klasse

Und da wären wir wieder bei meiner Frage: Wozu soll 3. Gut sein!?

Was genau meinst du mit Klasse? In meinen Beispielen wird keine Klasse geworfen, sondern Objekte von Klassen.

Abgesehen davon daß man mehrere EX Verdächtigte besser nicht in einen try{}Block setzt.

Also in dem Parserbeispiel lieber

FileOfSpecificType f = NULL;

try {
    f = new FileOfSpecificType(filePathAndName);
}
catch (IOError &ioe) {
    std::cerr << "Could not open " << filePathAndName << " for reading: "
        << ioe.what() << '\n';
}
catch (SecurityException &se) {
    std::cerr << "Permission denied: " << filePathAndName << '\n';
}
catch (MemoryError &me) {
    std::cerr << "Could not allocate enough memory for parsing " << filePathAndName
        << ": " << me.what() << '\n';
}

if (!f) return;

try {
    objekts = f->parse();
}
catch (IOError &ioe) {
    std::cerr << "Could not parse " << filePathAndName << ": "
        << ioe.what() << '\n';
}
catch (MemoryError &me) {
    std::cerr << "Could not allocate enough memory for parsing " << filePathAndName
        << ": " << me.what() << '\n';
}
catch (ParserException &pe) {
    std::cerr << "Unexpected token " << pe.token() << " in " << pe.file()
        << " at line " << pe.line() << ", position " << pe.pos() << '\n';
}

try {
    f->close();
    delete f;
}
catch (Eception &e) {
    std::cerr << "I'm already finished ;).\n";
}

statt

try {
    FileOfSpecificType f(filePathAndName);

    objects = f.parse();

    f.close();
}
catch (IOError &ioe) {
    std::cerr << "Could not parse " << filePathAndName << ": "
        << ioe.what() << '\n';
}
catch (SecurityException &se) {
    std::cerr << "Permission denied: " << filePathAndName << '\n';
}
catch (MemoryError &me) {
    std::cerr << "Could not allocate enough memory for parsing " << filePathAndName
        << ": " << me.what() << '\n';
}
catch (ParserException &pe) {
    std::cerr << "Unexpected token " << pe.token() << " in " << pe.file()
        << " at line " << pe.line() << ", position " << pe.pos() << '\n';
}

Also ich sehe da nicht den Vorteil der oberen Lösung. Welcher soll es sein?

Viele Grüße
Robert

0 85

Wozu Exception Objects

pl
  • programmiertechnik
  1. 2
    dedlfix
    1. 0
      pl
      1. 1
        dedlfix
        1. 0
          pl
          1. 0
            dedlfix
            1. 0
              pl
              • sonstiges
              1. 0
                dedlfix
                1. 0
                  pl
                  1. 0
                    perl
                    • perl
                    1. 0
                      pl
                      1. 0
                        perl
                        1. 0
                          pl
                          1. 0
                            perl
                  2. 0

                    NonSenseException

                    Camping_RIDER
                    • menschelei
      2. 0
        Robert B.
        1. 0
          Matthias Apsel
          1. 0
            Robert B.
            1. 0
              Rolf B
              1. 0
                Robert B.
        2. 0
          pl
          1. 0
            perl
          2. 0
            Rolf B
            1. 0
              pl
              1. 0
                Robert B.
                1. 0
                  pl
                  1. 0
                    Robert B.
              2. 1
                Rolf B
                1. 0
                  pl
                  1. 3
                    Tabellenkalk
          3. 1
            Robert B.
            1. 0
              pl
              1. 0
                Robert B.
                1. 0
                  pl
                  1. 0
                    Robert B.
                2. 1
                  dedlfix
                  1. 0
                    pl
                    1. 0
                      Robert B.
                      1. 0
                        pl
                        1. 0
                          Robert B.
                    2. 1
                      dedlfix
                      1. 0
                        pl
                        1. 0
                          Robert B.
                          • menschelei
                          • programmiertechnik
                        2. 2
                          dedlfix
            2. 1
              1unitedpower
              1. 0
                Robert B.
          4. 2

            Versuch einer Erläuterung zur Sinnhaftigkeit von Exception-Objekten

            Camping_RIDER
            1. 0
              pl
              1. 0
                Robert B.
              2. 0
                Camping_RIDER
            2. 0
              pl
              1. 0
                Robert B.
                • c++
                • programmiertechnik
                1. 0
                  pl
              2. 0
                Camping_RIDER
      3. 0
        Robert B.
        1. 0
          pl
          1. 0
            Robert B.
    2. 0
      Linuchs
      1. 0
        Matthias Apsel
        1. 0
          Linuchsx
          1. 0
            Matthias Apsel
            1. 1
              Christian Kruse
  2. 3
    Matti Mäkitalo
    1. 0
      pl
      1. 4
        Matti Mäkitalo
  3. 0
    Rolf B
    1. 0
      pl
      1. 0
        Rolf B
        1. 0
          pl
  4. 0
    pl
    1. 0
      Robert B.
      1. 0
        pl
        1. 0
          Robert B.
          • menschelei
          • programmiertechnik
          1. 0
            pl
            1. 0
              Robert B.
              • menschelei
    2. 0
      Rolf B
      1. -1
        pl
        1. 1
          Rolf B
          1. 0
            pl
            1. 1
              Mitleser
            2. 2
              Rolf B
              1. 0
                Robert B.
                • zu diesem forum
              2. 0
                JürgenB
                1. 0
                  Camping_RIDER
        2. 0
          Robert B.
          • menschelei