О ловле исключений передовой практики - PullRequest
15 голосов
/ 28 сентября 2011

Я пишу небольшую программу на C ++ 11 и действительно впервые использую исключения.

У меня вопрос о том, как эффективно отлавливать исключения, и после некоторого поиска в Google у меня все еще нет ответа.

Вот вопрос: Что является более эффективным (или рекомендуемым) между перехватом исключения с помощью (const?) Ссылки lvalue или (const?) Rvalue ссылки?

В коде это дает:

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) {}

Ответы [ 2 ]

32 голосов
/ 28 сентября 2011

Вы должны поймать по константе lvalue (2):

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

Обоснование:

В C ++ 11 возможно (с помощью shared_future), что два потокаможет раскручивать одно и то же исключение одновременно.Это может произойти в вашем коде, даже если вы не знаете об использовании shared_future, если только вы не управляете всем приложением.

Если два потока перехватывают одно и то же исключение одновременно и один или оба потокаизменяет исключение, тогда у вас есть условие гонки.

Так что, пока вам не нужно изменять объект исключения в предложении catch, позвольте компилятору применять эту политику для вас - catch by const&.Если вам действительно нужно изменить исключение, сделайте его копию, измените копию и выбросьте ее.Вы можете сделать это, перехватывая по значению, если вы уверены, что это не разделит ваш объект исключения (что обычно не происходит, если вы перехватываете std::exception).

1 голос
/ 28 сентября 2011

Я полагаю, что исключение должно быть перехвачено обычным способом с помощью lvalue-reference. Вот хорошее объяснение использования rvalues-ссылок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...