Как лучше использовать код ошибки в C++?
Я участник проекта, который использует C++11. Я не уверен, когда я должен использовать код ошибки для возвращаемых значений. Я обнаружил, что RVO в C++ прекрасно работает, даже если данные строки и структуры возвращаются напрямую. Но если я использую код возврата, я не могу получить выгоду от RVO, и код немного избыточен.
Поэтому каждый раз, когда я объявляю функцию, я не мог решить, какую из них использовать для возвращаемого значения. Как мне сохранить последовательность моего кода? Любой совет поможет мне.
// return string
MyError getString(string& out);
string getString();
// return struct
MyError getStructData(MyStruct& out);
MyStruct getStructData();
1 ответ
Обычно использование исключений вместо кодов ошибок является предпочтительной альтернативой в C++. Это имеет несколько причин:
- Как вы уже заметили, использование кодов ошибок в качестве возвращаемых значений не позволяет использовать возвращаемые значения для чего-то более "естественного"
- Глобальные коды ошибок, не поточнобезопасны и имеют несколько других проблем
- Коды ошибок можно игнорировать, исключения не могут
- Коды ошибок должны оцениваться после каждого вызова функции, который может быть неудачным, поэтому вы должны засорять свой код логикой обработки ошибок
- Исключения могут быть выброшены и переданы на несколько уровней в стек вызовов без дополнительной обработки
Конечно, существуют среды, в которых исключения недоступны, часто из-за ограничений платформы, например, во встроенном программировании. В этих случаях коды ошибок являются единственным вариантом.
Однако, если вы используете коды ошибок, будьте последовательны в том, как вы их передаете. Самое привлекательное использование кодов ошибок, которое я видел, которое не занимает место возвращаемого значения и все еще является поточно-ориентированным, было passign ссылкой на объект контекста в каждой функции. Объект контекста будет иметь глобальную информацию или информацию для каждого потока, включая коды ошибок для последних функций.