2009-03-27 14 views

Antwort

25

Ja, es ist gute Praxis inherit von std::runtime_error oder other standard exception classes wie std::logic_error, std::invalid_argument und so weiter, je nachdem, welche Art von Ausnahme ist.

Wenn alle Ausnahmen einen Weg von std::exception erben, ist es einfach, alle gängigen Fehler von catch(const std::exception &e) {...} zu erfassen. Wenn Sie mehrere unabhängige Hierarchien haben, wird dies komplizierter. Ableiten von den speziellen Ausnahmeklassen führt dazu, dass diese Ausnahmen mehr Informationen enthalten, aber wie nützlich das wirklich ist, hängt davon ab, wie Sie Ihre Ausnahmebehandlung durchführen.

+6

Catch von const ref: catch (std :: ausnahme const & e) –

+0

ja, das ist besser, änderte es ... – sth

1

Meiner Meinung nach ist es egal, ob Sie von std :: exception erben oder nicht. Für mich ist das Wichtigste beim Definieren von Ausnahmen:

  1. Die Namen der Ausnahmeklassen sind nützlich und klar.
  2. Dokumentieren eindeutig (Schreiben von Kommentaren), wenn die Ausnahme von einer Funktion oder Klassenmethode ausgelöst wird. Dies ist meiner Meinung nach der größte Fehlerpunkt bei der Ausnahmebehandlung.
1

Es macht keinen großen Unterschied machen, da std::runtime_error von std::exception erbt auch. Sie könnten argumentieren, dass der Laufzeitfehler mehr Informationen über die Ausnahme liefert, aber in der Praxis werden Leute oft nur von der Basisausnahmeklasse abgeleitet.

6

Ich bin kein C++ Entwickler, aber eine Sache, die wir in unserer C# -Code tat, war eine Basisklasse Ausnahme für unser Framework erstellen und dann die Ausnahme im Konstruktor geworfen log:

public FrameworkException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     log.Error(message, innerException); 
    } 

    ... 

Derived Die Exception muss nur den Basiskonstruktor aufrufen und wir erhalten eine konsistente Ausnahmeprotokollierung. Keine große Sache, aber nützlich.

+0

Sie müssen vorsichtig mit ausgefallenen Ausnahmen sein, besonders wenn die Konstruktion der Ausnahme selbst Ausnahmen auslösen kann. – Herbert

3

Es ist eine gute, wenn Ausnahme in einem Bereich platziert wird. Zum Beispiel kann die Klassenmanipulation innerhalb von Ausnahmeklassen Fehler melden.

und sie fangen wie

catch (const Manipulation::InputError& error) 
catch (const Manipulation::CalculationError& error) 

In solchen Fällen können sie nur leere Klassen ohne zusätzliche Fehlerinformationen sein, wenn Sie entwerfen können diese Ausnahmen fliegen viel oberen, wo Sie alle Standard Ausnahmen fangen.