gpt4 book ai didi

c++ - 关于 WINAPI 错误处理

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:58 24 4
gpt4 key购买 nike

我正在用 C++ 编写。我的大部分代码在失败时都会抛出异常。有时我不得不处理面向C且不抛出的Window API。因此,每次我调用 WINAPI 函数时,我都会检查返回值,如果它指示错误,我会使用 GetLastError() 来检索具体的错误代码。然后我将该错误代码转换为错误字符串并基于它抛出异常。

例如:

HANDLE ph = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, pid);

if (!ph) {
throw std::runtime_error(win_error_to_string(GetLastError()));
}

我想知道是否适合编写一个通用包装器来调用 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 的错误代码,这意味着函数失败,这是否总是正确的?

最佳答案

这个功能,就目前而言,是没有用的。通常,Win32 函数不会通过设置错误代码来指示失败。它们通过返回值指示失败。失败时为 false 的 BOOLNULLINVALID_HANDLE_VALUE 的句柄。等等。

有行为不当的函数失败,并在返回值中指出,但不设置错误代码。您的方法无法正确处理这些问题。有成功的功能,并设置错误代码。同样,您的功能会错误对待它们。

每个函数都有自己的错误处理规则。你必须根据每个人的优点来对待他们。按照该函数文档中的描述检查返回值。

也许您能做的最好的事情就是编写一个函数,该函数接受一个指示成功的 bool 值,并在失败时抛出错误。

void Win32Check(bool success)
{
if (!success)
throw std::runtime_error(win_error_to_string(GetLastError()));
}

这样调用它:

// DeleteFile returns returns BOOL indicating success
Win32Check(DeleteFile(...));

或者

// CreateFile returns a sentinel to indicate failure
HANDLE hfile = CreateFile(...);
Win32Check(hfile != INVALID_HANDLE_VALUE);

关于c++ - 关于 WINAPI 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32544287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com