处理错误的正确方法是什么?我的代码如下,处理我在MSDN上找到的所有错误代码,有时候,我收到错误“未知”。
HRESULT hr = pwb->Navigate2(&URL, &Flag, &TargetFrameName, &PostData, &Headers);
if(FAILED(hr))
{
std::string message("Navigate2 failed with reason: ");
switch(hr)
{
// The operation was successful.
case S_OK:
message.append("S_OK");
break;
// One or more parameters are invalid.
case E_INVALIDARG:
message.append("E_INVALIDARG");
break;
// Out of memory.
case E_OUTOFMEMORY:
message.append("E_OUTOFMEMORY");
break;
// The operation failed.
case E_FAIL:
message.append("E_FAIL");
break;
case E_ACCESSDENIED:
message.append("E_ACCESSDENIED");
break;
case E_POINTER:
message.append("E_POINTER");
break;
case E_UNEXPECTED:
message.append("E_UNEXPECTED");
break;
default:
message.append("Unknown");
}
}
答案 0 :(得分:1)
如何处理COM错误有很多变化。策略包括使用级联if SUCCEEDED()
或使用goto on FAILED()
等集中式功能错误处理。 MSDN上有一些很好的信息。
至于解释错误代码,FormatMessage()
通常会让您的工作更轻松 - 以下是MSDN的示例(为清晰起见,请在下方提供)
[来源:http://msdn.microsoft.com/en-us/library/windows/desktop/ms687061(v=vs.85).aspx]
#include <stdio.h>
#include <windows.h>
#include <tchar.h>
void ErrorDescription(HRESULT hr)
{
if(FACILITY_WINDOWS == HRESULT_FACILITY(hr))
hr = HRESULT_CODE(hr);
TCHAR* szErrMsg;
if(FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, hr, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR)&szErrMsg, 0, NULL) != 0)
{
_tprintf(TEXT("%s"), szErrMsg);
LocalFree(szErrMsg);
} else
_tprintf( TEXT("[Could not find a description for error # %#x.]\n"), hr);
}
在上面的调用中,标志指示窗口将为错误消息分配内存(您必须自由使用LocalFree()
)并且它将在系统消息表中查找错误消息({{1 }})。有时,(或通常取决于您使用的库类型) - 系统消息表中不会找到相应的错误描述。
在这些情况下,您可以自己处理错误描述(正如您在示例中所做的那样)或尝试直接加载库的消息表。为此,请使用FORMAT_MESSAGE_FROM_SYSTEM
并提供模块句柄作为FORMAT_MESSAGE_FROM_HMODULE
函数的lpSource
参数。
以下是一个例子:
FormatMessage()
答案 1 :(得分:0)
HRESULT
错误代码实际上是LONG
类型,其中的位块具有单独的含义。也就是说,处理switch
语句中的每个错误都是不现实的。
如果您对特定错误代码进行了特定处理,则可以执行此操作。否则,通常使用SUCCEEDED
和FAILED
宏检查返回的成功/失败:
if(FAILED(nResult))
{
// TODO: Handle the failed operation here
}
另请参阅:Error Codes in COM:
要检查COM方法是否成功,请检查高位 返回的HRESULT。 Windows SDK标头提供了两个宏 使这更容易:SUCCEEDED宏和FAILED宏。该 如果HRESULT是成功代码并且为FALSE,则SUCCEEDED宏返回TRUE 如果是错误代码。