Создание исключений без использования «нового» в Visual C ?

#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 заявления.