#exception #visual-c #smart-pointers
Вопрос:
У меня есть свое собственное исключение в моем приложении. И в тот момент, когда я бросаю его вот так:
throw new CChristianLifeMinistryEntryException(strError);
Понятно, что анализ кода запускает это, потому что я использовал new
.
Это предполагает, что я использую make_unique
, и я пытаюсь установить, является ли это правильным способом обновления этого кода.
Ответ №1:
В C исключения обычно являются производными std::exception
и генерируются по значению, а также перехватываются по ссылке. Таким образом, вам не нужно управлять временем жизни (не нужно удалять некоторые исключения после обработки и не удалять другие).
Нравится throw std::runtime_error(str_error);
.
Подход MFC к созданию ссылок с new
поддержкой исключений компилятора C предшествовал поддержке исключений, поэтому существовал способ создания исключения указателя, но не произвольного типа исключения. Это не рекомендуется для нового кода.
Для вызываемых исключений существует специальный интеллектуальный указатель exception_ptr
, обычно он необходим для передачи исключений между потоками, а не для переноса создаваемых исключений.
Если вы обернете исключение unique_ptr
, вам придется поймать его обернутым, и это catch
не приведет к перехвату производного исключения, потому что они разные unique_ptr
и не являются производными друг от друга, поэтому обертывание исключений таким образом определенно не является хорошей идеей.
Комментарии:
1. Хммм. Я понимаю. Я думаю, что на данном этапе модернизации моего кода я просто оставлю их такими, какие они есть. Иначе мне тоже придется пересмотреть
catch
заявления.