Вы должны сообщить о некотором сбое. Вы можете сделать это с помощью исключений или кодов состояния. Лично я склоняюсь к кодам статуса, если это возможно, особенно в библиотечном коде.
Было время, когда вы не могли быть уверены в том, что исключение действительно будет поймано, если код, выполняющий ловушку, не был создан той же версией того же самого компилятора с теми же флагами, что и код, бросающий исключение. Это, по-видимому, было в значительной степени решено на платформах, которые имеют de facto стандарт ABI. Но как только я привык сообщать о сбоях в библиотечном коде без исключений, я обнаружил, что есть веские причины продолжать это делать.
Во-первых, библиотеки предназначены для использования третьими лицами, и эти стороны, возможно, не слишком волнуются о writing exception safe code.
Исключительный безопасный код касается не только управления ресурсами. Рассмотрим:
...
// m is a mutex
boost::scoped_lock(m); // now I can't forget to release the mutex
withdraw_money(acct1, 1000);
function_that_may_throw_exception();
deposit_money(acct2, 1000);
Конечно, это можно переписать так:
// using Boost SCOPE_EXIT
bool commit = false;
boost::scoped_lock(m);
withdraw_money(acct1, 1000);
SCOPE_EXIT((&commit) (&acct1))
{
if (!commit) {
deposit_money(acct1, 1000);
}
}
function_that_may_throw_exception();
deposit_money(acct2, 1000);
commit = true;
Исключения решить многие проблемы, но они не решают всех проблем, связанных с ошибкой обработки/обнаружения. Написание недействительного кода максимально возможно с исключениями, такими как коды состояния.
Все, что лучше, чем бесшумно. –
Если вы пишете библиотеку, вы можете повторно использовать ее в будущем или распространять ее друзьям/коллегам. Лично я бросаю исключения повсюду, чтобы дать мне гибкость в обращении с ним или игнорировать его в конечном приложении, в отличие от молчания в библиотеке. – dotalchemy
Лучше, почему вы используете указатель вместо ссылки, особенно если вы должны ссылаться на действительный объект. – GManNickG