小编dra*_*m17的帖子

关于WINAPI错误处理

我正在写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不同的错误代码,这意味着该函数失败了吗?

c++ error-handling winapi

4
推荐指数
2
解决办法
1242
查看次数

标签 统计

c++ ×1

error-handling ×1

winapi ×1