Status macros

English version: https://telegra.ph/Status-macros-11-14

В продолжение к предыдущему посту об удобном способе обработки ошибок в C++.

В гугловых проектах используются специальные классы Status и StatusOr<T> (см. https://t.me/sea_plus_plus/23), которые возвращаются из методов, в которых может произойти ошибка, например

Status WriteToFile(std::string_view content);

или

StatusOr<std::string> ReadFromFile();

Обычным способом проверки является if:

Status Write(std::string_view content) {

Status status = WriteToFile(content);

if (!status.ok())

return status;

return Status::OK();

}

StatusOr<std::string> Read() {

StatusOr<std::string> content = ReadFromFile();

if (!content.ok())

return content.status();

return content.ValueOrDie();

}

Но это громоздко. В основном, используются специальные макросы (https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/stubs/status_macros.h):

Status Write(std::string_view content) {

RETURN_IF_ERROR(WriteToFile(content));

return Status::OK();

}

StatusOr<std::string> Read() {

std::string content;

ASSIGN_OR_RETURN(content, ReadFromFile());

return content;

}

Макросы, в общем случае, не рекомендуется использовать в C++. Но тут, на мой взгляд, они вполне оправданы. К тому же в if внутри макроса можно поставить атрибут [[unlikely]] и получить прирост в производительности, а так пришлось бы в каждый if писать ее явно. В общем, в этом случае только польза.

November 14, 2019
No comments here yet...
Do you want to add a new comment?