Ich habe oft gehört und gelesen, dass es besser ist, eine Ausnahme als Referenz auf const zu fangen, als als Referenz. Warum ist:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
besser als:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
std::exception
diewhat()
Funktion von ') aufrufen zu können . Wenn Sie nach Wert abfangen, können Sie diese Funktion nicht aufrufen und die ursprünglichen Ausnahmedetails abrufen.Grundsätzlich gibt es überhaupt keinen Grund.
Ausnahmeobjekte befinden sich in ihrem eigenen Speicherbereich †, sodass Sie sich keine Gedanken über das Abfangen von Ausnahmen machen müssen, die in temporären Ausdrücken erstellt wurden.
Alles, was Sie tun, ist zu versprechen, dass Sie das Ausnahmeobjekt nicht ändern werden, aber da Ausnahmeobjekte eine unveränderliche Schnittstelle haben sollten ‡ , gibt es hier wirklich nichts Praktisches.
Es könnte jedoch dazu führen, dass Sie sich warm und gemütlich fühlen, wenn Sie es lesen - so ist es für mich!
† Sie haben einen eigenen, speziellen, threadlokalen Stack.
‡ Haftungsausschluss: Boost.Exception unterbricht dies, um funky Sachen zu machen und Ausnahmedetails nach der Konstruktion hinzuzufügen. Aber das ist Hackery!
quelle
Exception objects live in their own memory space
? Haben Sie eine gute Lektüre, um dies vorzuschlagen?Es teilt dem Compiler mit, dass Sie keine Funktion aufrufen, die die Ausnahme ändert, was zur Optimierung des Codes beitragen kann. Wahrscheinlich macht es keinen großen Unterschied, aber die Kosten dafür sind auch sehr gering.
quelle
Wirst du die Ausnahme ändern? wenn nicht, kann es auch const sein. Der gleiche Grund, warum Sie const irgendwo anders verwenden sollten (ich sage SOLLTE, weil es auf der Oberfläche nicht wirklich so viel Unterschied macht, Compilern helfen könnte und auch Codierern hilft, Ihren Code richtig zu verwenden und keine Dinge zu tun, die sie nicht tun sollten).
Ausnahmebehandlungsroutinen können plattformspezifisch sein und Ausnahmen an lustigen Orten platzieren, weil sie nicht erwarten, dass sie sich ändern?
quelle
Aus dem gleichen Grund verwenden Sie eine const.
quelle