我正在写C++.我的大多数代码在失败时抛出异常.有时我必须处理面向C的Window API并且不抛出.因此,每次调用WINAPI函数时,我都会检查返回值,如果它指示错误,我使用GetLastError()来重新编译concreate错误代码.然后我将该错误代码转换为错误字符串并基于它抛出异常.例如:
HANDLE ph = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);
if (!ph) {
throw std::runtime_error(win_error_to_string(GetLastError()));
}
Run Code Online (Sandbox Code Playgroud)
我想知道如果在调用期间设置了错误,是否适合编写调用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;
}
Run Code Online (Sandbox Code Playgroud)
该技术的优点是我不必在每次WINAPI调用后检查返回值,假设如果函数没有抛出结果是正确的.
HANDLE ph = call_winapi(OpenProcess, PROCESS_QUERY_INFORMATION, FASLE, pid);
Run Code Online (Sandbox Code Playgroud)
但我害怕错过了什么.就像,如果WINAPI函数设置一个与ERROR_SUCCESS不同的错误代码,这意味着该函数失败了吗?