处理错误 (BITS)

应用程序中有两种类型的错误要处理。 第一个错误是方法调用失败。 每个方法都返回一个 HRESULT 值。 每个方法的引用页标识最有可能生成的返回值。 有关其他返回值,请参阅 BITS 返回值。 要获取与返回值关联的消息文本,请调用 IBackgroundCopyManager::GetErrorDescription 方法。

第二种要处理的错误类型是其状态转换为 BG_JOB_STATE_ERRORBG_JOB_STATE_TRANSIENT_ERROR 的作业。 若要检索与这些类型的错误相关的信息,请调用作业的 IBackgroundCopyJob::GetError 方法。 该方法返回一个 IBackgroundCopyError 接口指针,其中包含用于确定错误原因的信息。 还可以通过注册接收事件通知来接收错误通知。 有关详细信息,请参阅注册 COM 回调

BITS 认为每个作业都是原子作业。 如果作业中的某个文件生成错误,则该作业将保持错误状态,直到错误得到解决。 因此,无法从作业中删除导致错误的文件。 但是,如果错误是由服务器不可用或远程文件无效引起的,则可以调用 IBackgroundCopyJob3::ReplaceRemotePrefixIBackgroundCopyFile2::SetRemoteName 方法来标识新的服务器或文件名。

确定错误原因后,执行以下选项之一:

对于上传-答复作业,请检检查 BG_JOB_REPLY_PROGRESS 结构的 BytesTotal 成员的值,以确定错误是否发生在作业的上传或答复部分。 如果值为 BG_SIZE_UNKNOWN,则表示上传时发生错误。

以下示例显示如何检索 IBackgroundCopyError 接口指针。 该示例假定 IBackgroundCopyJob 接口指针有效。

HRESULT hr = 0;
HRESULT hrError = 0;
IBackgroundCopyJob* pJob;
IBackgroundCopyError* pError = NULL;
IBackgroundCopyFile* pFile = NULL;
WCHAR* pszDescription = NULL;
WCHAR* pszRemoteName = NULL;
BG_ERROR_CONTEXT Context;

hr = pJob->GetError(&pError);
if (SUCCEEDED(hr))
{
  //Retrieve the HRESULT associated with the error. The context tells you
  //where the error occurred, for example, in the transport, queue manager, the 
  //local file, or the remote file.
  pError->GetError(&Context, &hrError);  

  //Retrieve a description associated with the HRESULT value.
  hr = pError->GetErrorDescription(LANGIDFROMLCID(GetThreadLocale()), &pszDescription);
  if (SUCCEEDED(hr))
  {
    if (BG_ERROR_CONTEXT_REMOTE_FILE == Context)
    {
      hr = pError->GetFile(&pFile);  
      if (SUCCEEDED(hr))
      {
        hr = pFile->GetRemoteName(&pszRemoteName);
        if (SUCCEEDED(hr))
        {
          //Do something with the information.
          CoTaskMemFree(pszRemoteName);
        }
        pFile->Release();
      }
    }
    CoTaskMemFree(pszDescription);
  }
  pError->Release();
}
else
{
  //Error information is not available.
}