Я пишу С++ API в Windows с VS 2010, который экспортирует несколько классов из DLL. Мы планируем позже поддерживать другие платформы (MacOS, Linux).
В настоящее время я размышляю над тем, как разработать обработку ошибок. Я не хочу использовать исключения из-за проблемы на границе DLL (по крайней мере, в Windows).
Я придумал следующие три проекта.
Дизайн 1:
Для каждого метода возвращаемое значение будет указывать, было ли операция успешной или неудачной, возвращая либо true/false
, либо pointer/nullptr
, соответственно. Затем клиент может вызвать GetLastError()
, чтобы получить код ошибки (enum), который детализирует последний сбой.
typedef std::shared_ptr<Object> ObjectPtr;
class APIClass
{
bool SetSomething(int i);
bool IsSomethingSet();
bool DoSomething();
ObjectPtr GetSomething();
ErrorCode GetLastError();
}
Дизайн 2:
Каждый метод возвращает код ошибки. [out] должны передаваться как указатели и [in] параметры по значению или по (const).
typedef std::shared_ptr<Object> ObjectPtr;
class APIClass
{
ErrorCode SetSomething(int i);
ErrorCode IsSomethingSet(bool* outAsk);
ErrorCode DoSomething();
ErrorCode GetSomething(ObjectPtr* outObj);
}
Дизайн 3:
Как и дизайн 1, но вы можете передать дополнительный код ошибки как параметр [out] для каждой функции.
typedef std::shared_ptr<Object> ObjectPtr;
class APIClass
{
bool SetSomething(int i, ErrorCode* err = nullptr);
bool IsSomethingSet(ErrorCode* err = nullptr);
bool DoSomething(ErrorCode* err = nullptr);
ObjectPtr GetSomething(ErrorCode* err = nullptr);
}
Я хочу сохранить дизайн простым, последовательным и чистым. Какой дизайн вы бы выбрали в качестве клиента? У вас есть другие предложения для лучшего дизайна? Можете ли вы привести некоторые причины, по которым один дизайн лучше или если это просто вопрос вкуса?
Примечание: Здесь есть аналогичный вопрос: С++ API дизайн и обработка ошибок. Но я не хочу использовать решение в принятом ответе там или использовать что-то вроде boost:: tuple как возвращаемое значение.