Краткий ответ на вопрос о названии - идиома, обозначающая функцию, которую может выдать функция, - это , а не , чтобы задокументировать ее «эта функция не выбрасывает». То есть все может скинуть по умолчанию.
C ++ не является Java и не имеет проверенных компилятором исключений. В C ++ нет ничего, что позволяло бы компилятору сообщать вам, что ваш код утверждает, что он не сгенерирует, но вызывает то, что может. Таким образом, вы не можете полностью избежать этой проблемы во время выполнения. Инструменты статического анализа могут помочь, не уверен.
Если вы заботитесь только о MSVC, вы можете рассмотреть возможность использования пустой спецификации исключений или __declspec(nothrow)
для функций, которые не выдают, и throw(...)
для функций, которые выполняют. Это не приведет к неэффективному коду, поскольку MSVC не испускает код, чтобы проверить, что функции, объявленные nothrow, на самом деле не генерируют. GCC может сделать то же самое с -fno-enforce-eh-specs
, проверьте документацию вашего компилятора. Все будет автоматически задокументировано.
Вариант 2, try-catch для всего приложения на самом деле не "для безопасности", это просто потому, что вы думаете, что вы можете сделать что-то более полезное за исключением (например, распечатать что-то и выйти чисто), чем просто позволить C ++ вызов времени выполнения terminate
. Если вы пишете код в предположении, что что-то не сработает, и это действительно происходит, то вы, возможно, остались неопределенными до того, как произойдет одно из них, например, если деструктор делает ложное предположение о согласованном состоянии.
Обычно я бы сделал вариант (1): для каждого документа функции, какую гарантию исключения он предлагает - nothrow, strong, слабый или нет. Последний баг. Первый ценится, но редко, и при хорошем кодировании строго необходим только для функций подкачки и деструкторов. Да, он подвержен ошибкам пользователя, но любые средства кодирования C ++ с исключениями подвержены ошибкам пользователя. Кроме того, также выполните (2) и / или (3), если это поможет вам обеспечить соблюдение (1).
Symbian имеет предстандартный диалект C ++ с механизмом, называемым «отпуск», который в некоторых отношениях похож на исключения. Соглашение в Symbian состоит в том, что любая функция, которая может выйти, должна именоваться с L в конце: CreateL
, ConnectL
и т. Д. В среднем это уменьшает ошибку пользователя, потому что вы можете легче увидеть, вызываете ли вы что-то который может уйти. Как и следовало ожидать, те же люди ненавидят тех, кто ненавидит венгерскую нотацию приложений, и если почти все функции покидают ее, она перестает быть полезной. И, как и следовало ожидать, если вы напишите функцию, в имени которой не будет указано L, в отладчике может пройти много времени, прежде чем вы обнаружите проблему, потому что ваши предположения уводят вас от реальной ошибки.