Wiele razy słyszałem i czytałem, że lepiej jest wychwycić wyjątek jako odniesienie do stałej, a nie jako odniesienie. Dlaczego jest:
try {
// stuff
} catch (const std::exception& e) {
// stuff
}
lepszy niż:
try {
// stuff
} catch (std::exception& e) {
// stuff
}
std::exception
„swhat()
funkcji). Jeśli złapiesz według wartości, nie możesz wywołać tej funkcji i uzyskać oryginalnych szczegółów wyjątku.W zasadzie nie ma żadnego powodu.
Obiekty wyjątków żyją we własnej przestrzeni pamięci †, więc nie musisz się martwić o przechwytywanie wyjątków utworzonych w tymczasowych wyrażeniach.
Wszystko, co robisz, to obiecywanie, że nie zmodyfikujesz obiektu wyjątku, ale ponieważ obiekty wyjątków powinny mieć niezmienny interfejs ‡ , tak naprawdę nie ma tu nic praktycznego.
Jednak może sprawić, że poczujesz się ciepło i przytulnie, gdy to przeczytasz - tak to jest dla mnie!
† Mają własny, specjalny stos lokalny dla wątków.
‡ Zastrzeżenie: Boost.Exception przerywa to, aby robić fajne rzeczy i dodawać szczegóły wyjątków po zakończeniu konstrukcji. Ale to jest hakerstwo!
źródło
Exception objects live in their own memory space
? Czy masz dobrą lekturę, aby zasugerować na ten temat?Mówi kompilatorowi, że nie będziesz wywoływał żadnej funkcji modyfikującej wyjątek, co może pomóc w optymalizacji kodu. Prawdopodobnie nie robi to dużej różnicy, ale koszt zrobienia tego jest również bardzo mały.
źródło
czy zamierzasz zmodyfikować wyjątek? jeśli nie, to równie dobrze może być const. Z tego samego powodu, dla którego POWINIENEŚ używać const gdziekolwiek indziej (mówię POWINNO, ponieważ tak naprawdę nie robi to tak dużej różnicy na powierzchni, może pomóc kompilatorom, a także pomóc programistom w prawidłowym używaniu twojego kodu i nie robieniu rzeczy, których nie powinni)
programy obsługi wyjątków mogą być specyficzne dla platformy i mogą umieszczać wyjątki w zabawnych miejscach, ponieważ nie spodziewają się ich zmiany?
źródło
Z tego samego powodu używasz const.
źródło