Отказ от исключений в вашем собственном коде относительно прост: вы просто не используете оператор throw
.
Не выбрасывать исключения из сбоев выделения памяти немного более болезненно: либо вы не используете обычный new
(вместо этого используйте new(std::nothrow)
или malloc
или что-то еще), либо вы используете нестандартную опцию компилятора, чтобы получить его делать что-то нестандартное в случае сбоя (например, немедленно завершить программу или вернуть 0
), или вы переопределяете operator new
, чтобы сделать что-то нестандартное в случае сбоя.
Если выбранный вами подход заключается в немедленном прекращении работы программы, вы можете реализовать это с помощью set_new_handler()
, о котором я забыл, пока litb не напомнил мне.
Это оставляет проблему работы с исключениями, генерируемыми библиотеками C ++, которые вы не поддерживаете. Обычно вам нужно обернуть библиотечные вызовы в оболочку, которая выглядит примерно так:
int DoSomething(int &output, const int input) throw() {
try {
output = library_do_something(input);
return 1;
} catch (...) {
return 0;
}
}
catch (...)
перехватывает все возможные исключения C ++ из library_do_something
(а также оператор присваивания в output
, который здесь не актуален), отбрасывает всю информацию, которую они могли содержать, и затем отображает все эти сбои 0
.
Обратите внимание, что этот стиль означает, что вы вообще не можете использовать RAII, даже немного, потому что у вас нет способа сообщить о сбое в конструкторе. Весь смысл RAII состоит в том, что вы получаете все свои ресурсы внутри конструкторов, так что они будут должным образом освобождены деструктором во время распространения исключений. Но приобретение ресурсов - это то, что по сути всегда может потерпеть неудачу. Так что вы не можете сделать это внутри конструктора.