作为异常的替代方案,您还可以在参数列表中返回字符串引用,并通过返回 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;
}
另一种避免使用引用参数的替代方法是返回一个包装值的类的实例,但也让您知道值是否存在,例如:
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;
};
请注意,您可以很容易地对此包装器进行模板化。然后您的函数将会是:
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();
}
SetLastError()
设置上一个错误。http://msdn.microsoft.com/en-us/library/ms680627(v=vs.85).aspx - Mihran HovsepyanGetLastError
值封装在特定的异常类型中,那将更好。 - Matteo ItaliaGetLastError
比捕获异常更为丑陋。 - user500944