2011-09-28 13 views
14

Piszę mały program w C++ 11 i naprawdę używam wyjątków po raz pierwszy.O wychwytywaniu wyjątków dobre praktyki

Mam pytanie o to, jak efektywnie wychwycić wyjątki, a po jakimś przeszukaniu go nadal nie mam odpowiedzi.

Oto pytanie: Co jest bardziej efektywne (lub zalecane) pomiędzy wychwyceniem wyjątku przez (const?) Wartość odniesienia l, lub przez (const?) Wartość odniesienia rvalue?

W kodzie tym podać:

1)

try { throw std::exception{"what"}; } 
catch (std::exception& ex) {} 

2)

try { throw std::exception{"what"}; } 
catch (const std::exception& ex) {} 

3)

try { throw std::exception{"what"}; } 
catch (std::exception&& ex) {} 

4)

try { throw std::exception{"what"}; } 
catch (const std::exception&& ex) {} 
+1

Złapanie według wartości rvalue jest nielegalne http://stackoverflow.com/q/21977340/5447906 –

Odpowiedz

31

Należy złapać przez const odniesienia lwartości (2):

try { throw std::exception{"what"}; } 
catch (const std::exception& ex) {} 

Uzasadnienie:

w C++ 11 możliwe jest (poprzez korzystanie z shared_future) że dwa wątki mogą odradzać ten sam wyjątek w tym samym czasie. To może się zdarzyć w twoim kodzie, nawet jeśli nie wiesz, że używasz shared_future, chyba że kontrolujesz całą aplikację.

Jeśli dwa wątki są wychwytywane, odradzając jednocześnie ten sam wyjątek, a jeden lub oba wątki modyfikują wyjątek, oznacza to, że masz wyścig.

Tak długo, jak nie musisz modyfikować obiektu wyjątku w klauzuli catch, pozwól kompilatorowi na wymuszenie tej zasady dla Ciebie - catch przez const&. Jeśli naprawdę potrzebujesz zmodyfikować wyjątek, wykonaj jego kopię, zmodyfikuj kopię i wyrzuć kopię. Możesz to zrobić, łapiąc według wartości, jeśli jesteś pewien, że to nie przekroi twojego obiektu wyjątku (co zwykle nie ma miejsca, jeśli łapiesz std::exception).

+0

Dziękuję za odpowiedź, która jest naprawdę pomocna i przejrzysta. – Geoffroy

1

Przypuszczam, że wyjątek powinien zostać złapany w zwykły sposób przez odniesienie do wartości l. Here's dobre wyjaśnienie rvalues ​​odniesień używać

Powiązane problemy