Я пишу на C++. Большинство ошибок моего кода генерируют исключения при сбое. Иногда мне приходится иметь дело с API-интерфейсом Window, который является C-ориентированным и не бросает. Поэтому каждый раз, когда я вызываю функцию WINAPI, я проверяю возвращаемое значение, и если он указывает на ошибку, я использую GetLastError() для повторного восстановления кода ошибки конкретизации. Затем я конвертирую этот код ошибки в строку ошибки и создаю исключение на основе этого. Например:об обработке ошибок WINAPI
HANDLE ph = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
if (!ph) {
throw std::runtime_error(win_error_to_string(GetLastError()));
}
мне было интересно, если это уместно, чтобы написать общий wraper, что вызывать функцию WinAPI исключение броска, если ошибка была установлена во время вызова. Нечто подобное:
template <typename R, typename... Args>
decltype(auto) call_winapi(R(WINAPI*func)(Args...), Args... &&args)
{
SetLastError(ERROR_SUCCESS);
const R result = func(args);
const DWORD error = GetLastError();
if (error != ERROR_SUCCESS) {
throw std::runtime_error(win_error_to_string(error));
}
return result;
}
Преимущество этого метода заключается в том, что я не должен проверять возвращаемое значение после каждого вызова WINAPI, при условии, что результат является правильным, если функция не бросает.
HANDLE ph = call_winapi(OpenProcess, PROCESS_QUERY_INFORMATION, FASLE, pid);
Но, боюсь, я что-то пропустил. Например, всегда ли верно, что если функция WINAPI устанавливает код ошибки, который отличается от ERROR_SUCCESS, это означает, что функция не выполнена?
вы можете проверить код ошибки и отличаются уважение потока к коду ошибки, который легче, чем сравнение строк. вы можете наследовать исключение с атрибутом errcode. – ataman
@ataman, также можно будет адаптировать 'std :: system_error', который включает коды ошибок. – chris
@chris О, я не знал об этом. спасибо;) – ataman