use*_*rbb 3 c++ error-handling exception-handling
我试图为winapi函数制作包装器GetWindowText.函数返回std :: wstring,但我不知道如何处理错误发生的地方.我返回NULL但我知道这是错的.
std::wstring GetWindowText(HWND handle)
{
const int size = 1024;
TCHAR wnd_text[size] = {0};
HRESULT hr = ::GetWindowText(handle,
wnd_text, size);
if(SUCCEEDED(hr))
return std::wstring(wnd_text);
else
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
小智 7
而是抛出异常.
std::wstring GetWindowText(HWND handle)
{
const int size = 1024;
TCHAR wnd_text[size] = {0};
HRESULT hr = ::GetWindowText(handle,
wnd_text, size);
if(SUCCEEDED(hr))
return std::wstring(wnd_text);
else
throw std::runtime_error("insert error message here");
}
Run Code Online (Sandbox Code Playgroud)
作为异常的替代,您还可以在参数列表中通过引用返回字符串,并通过返回true或false来表示成功
bool GetWindowText(HWND handle, std::wstring& windowText)
{
const int size = 1024;
TCHAR wnd_text[size] = {0};
HRESULT hr = ::GetWindowText(handle,
wnd_text, size);
if(SUCCEEDED(hr))
{
windowText = wnd_text;
return true;
}
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
避免引用参数的另一个替代方法是返回包装值的类的实例,但也让您知道值是否存在,例如
class ValueWrapper
{
public:
ValueWrapper() : present( false ) {}
ValueWrapper( const std::wstring& s ) : value( s ), present( true ) {}
bool isPresent() const { return present; }
const std::wstring& getValue() const { return value; }
private:
std::wstring value;
bool present;
};
Run Code Online (Sandbox Code Playgroud)
请注意,您可以非常轻松地模拟此包装器.那么你的功能就是
ValueWrapper GetWindowText(HWND handle)
{
const int size = 1024;
TCHAR wnd_text[size] = {0};
HRESULT hr = ::GetWindowText(handle,
wnd_text, size);
if(SUCCEEDED(hr))
return ValueWrapper( wnd_text );
else
return ValueWrapper();
}
Run Code Online (Sandbox Code Playgroud)